#java #spring
#java #spring
Вопрос:
У меня есть два проекта spring. Оба в настоящее время являются портлетами.
Я хотел бы взять один и преобразовать его в jar и добавить его в качестве зависимости (используя maven) к другому, затем вызвать код)
Любые советы по шагам были бы замечательными.
Я пробовал, и хотя все (включая контекст) упаковывается в мой jar, при вызове классов из портлета, использующего jar, появляется, что контекст приложения не загружен / не работает
Current jar structure
application-context.xml
META-INF/
<package>/classes
ПРАВКА__
Повторные ошибки: не удается найти определение компонента для класса x
Комментарии:
1. вы имели в виду, что при попытке загрузить контекст приложения из jar он не работает? если это так, сообщение об ошибке?
Ответ №1:
Есть несколько способов сделать это, но это сильно зависит от того, что вы пытаетесь сделать. Вы можете включить контекст в свой web.xml …
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml, classpath:childContext.xml</param-value>
</context-param>
Другой вариант — импортировать дочерний контекст непосредственно из контекста вашего приложения.
<import resource="classpath:childContext.xml/>
Я не слишком большой поклонник этого, поскольку эти контексты объединяются, что может быть кошмаром для имен компонентов; тем не менее, они работают.
Обычно лучше, чтобы ваш JAR предоставлял какой-то завод или статический конструктор, который считывает свой собственный Spring config XML, а затем просто предоставляет то, что вы хотите использовать в качестве сервиса. Возможно, это не лучшее решение для вашей конкретной проблемы, но это то, что следует учитывать.
Комментарии:
1. Спасибо, я попробую это. (опция factory / static method) Поэтому я бы использовал объект ApplicationContext в этом методе — Есть какие-либо советы по файловой структуре, которую должен использовать мой jar shoudl? — Я отредактирую приведенное выше, чтобы показать текущую структуру
2. Сработало как по волшебству!!! Создание статического метода, загрузка контекста и получение из него компонента service было на месте.
Ответ №2:
Технически ответы, предоставленные Эндрю, будут работать. Но, как он отмечает, обычно не очень хорошая идея объединять таким образом компоненты из разных проектов. Возможно, вы захотите немного отступить назад и рассмотреть эти вопросы:
- Почему эти два разных проекта в первую очередь? Вы хотите повторно использовать второй проект в нескольких родительских проектах?
- Какие компоненты / службы, предоставляемые дочерним контекстом, должны использоваться непосредственно родительским контекстом.
Переосмысление этих зависимостей может привести к более элегантному и удобному в обслуживании решению.
Комментарии:
1. Большое спасибо, ответ на 1. да. Ответ на 2 — это код, который предоставляет сервис, который ищет информацию в dbs для создания объекта, используемого всеми другими потребителями (я не хочу создавать это в каждом проекте)