2014-05-24 4 views
2

У меня возникают проблемы при развертывании приложения Java EE и вы можете использовать некоторые советы.
У меня 3 компонентов для развертывания:Проблема развертывания Java EE

  • интеграции слой (данные): POJOs и CDI Beans - JAR-файл
  • прикладного уровня (BL): EJBs, CDI Фасоль и POJOs - JAR-файл
  • презентации слой: сервлеты и такое - файл WAR

Оптимально, я хотел бы иметь возможность развернуть оба интеграции и прикладного уровня JARs в том же сервере Java EE, но как отдельные файлы JAR (так как я мог бы изменить конфигурации оборудования позже и разделить их на два разных сервера на двух отдельных машинах).
Проблема заключается в том, что я не могу получить инъекцию CDI из JAR уровня интеграции в JAR прикладного уровня для работы. Сервер говорит (и, вероятно, справедливо), что невозможно разрешить инъекции.

До сих пор я придумал эти возможные решения:

  • Пакет два JAR-файлы в один файл EAR (может быть, бросить в WAR, а также ...), и развернуть этот
  • Используйте JNDI между различными слоями (возможно, создать CDI-производителя для создания общей инъекции на основе JNDI-имен или что-то в этом роде)
  • На уровне интеграции сделайте объекты, которые вводятся в EJB прикладного уровня (DAO) вместо CDI-компонентов

Мне не нравятся ни одно из этих решений (особенно последнее), поскольку они ограничивают мои будущие варианты развертывания. Второе решение не ограничивает меня, но в какой-то момент оно может стать утомительным (когда я накапливаю много кода).

Наконец, мой вопрос:
Есть ли вариант я еще не нашел, что позволило бы мне развернуть два JARs на одном сервере с инъекцией CDI работает? Возможно, что-то еще будет работать, если в какой-то момент я отделяю JAR на разные серверы?

ответ

2

Да, есть и другие варианты.

  1. Используйте контейнер Java EE, который поддерживает OSGi, а также используйте интерфейс OSGi для ваших зависимостей развертывания. По крайней мере, Websphere, Glassfish, JBoss (с установленным jbosgi), Jonas поддерживает развертывание пакетов OSGi. Это означает, что ваши модули должны быть преобразованы в пакеты OSGi.

  2. Используйте расширение для конкретного контейнера, которое позволяет модулю связываться между собой. JBoss как jboss-deployment-structure.xml, который вы можете использовать, чтобы иметь зависимость от другого развертывания.

  3. Используйте общий путь к классам для ваших зависимостей. Не рекомендовал бы это.

Мое голосование за OSGi.

Ни один из них не будет работать сам по себе, если вы разворачиваете пакеты на разные серверы. Для разных серверов требуются удаленные технологии, такие как удаленные EJB, удаленные JNDI-запросы, перенос Spring, HTTP-api, CORBA или аналогичные. В Java EE EJB является де-факто стандартом для этого, но Spring remoting тоже неплохо.


Обновление: вы добавили, что используете серверы TomEE. Действительно, TomEE не поддерживает первые два варианта, о которых я говорил. В этом случае я бы использовал EJB - тот факт, что вы используете EJB, можно отделить от бизнес-уровня с помощью делегата EJB, и вы можете использовать EJB (сессионный компонент без состояния) только для части интерфейса, оставив ваши DAO как POJO ,

+0

Я развертываю сервер TomEE, и я не думаю, что он поддерживает любой из этих параметров. Я также заинтересован в том, чтобы держать вещи в независимости от выбора сервера, насколько это возможно, в случае, если я позже изменю сервер. Я понимаю, что EJB - это способ сделать это, моя единственная забота заключается в том, что объекты, перемещающиеся с моего уровня интеграции на мой прикладной уровень, являются DAO, и по какой-то причине мне кажется неправильным сделать их EJB. Я ошибаюсь ? – eitanfar

+1

@eitanfar, если вы используете EJB для этого, это ваш уровень интерфейса, который должен быть EJB (точнее, сессионные компоненты без состояния), а не сами DAO! То, как я реализовал это, - это иметь EJB-слой для интерфейса -> компонентный сервисный интерфейс -> реализация компонента - внутренние DAO. Это позволяет максимально развязывать и разделять проблемы, которые мне нужны. Кроме того, для всех моих EJB есть отдельный делегат EJB, который фактически используется для поиска, поэтому тот факт, что поиск EJB сделан, невидим для прикладного уровня. Затем делегат EJB может использоваться как POJO. – eis

+1

Я понимаю, что это может быть больше слоев, чем вы хотите, и, конечно, не обязательно иметь это много слоев. – eis

0

не уверены, что ваша цель, но развертывание войны в порядке, даже можно сделать вручную с помощью следующих команд:

mkdir -p webapps/myapp/WEB-INF/lib 
cp myjar*.jar webapps/myapp/WEB-INF/lib/ 

Если ваша цель состоит в том, чтобы иметь возможность разделить их можно использовать TomEE тощей особенность войны ,

Создайте войну с файлом WEB-INF/jars.txt.

В этом jars.txt помещается одна строка зависимости/jar. Это может быть путь к координатам jar или maven.

После установки это позволит вам поменять банки по очереди, а затем просто перезапустить сервер. Это здорово, когда несколько команд работают над одним и тем же двоичным кодом.

Есть несколько альтернатив с TomEE, но у этого есть преимущество, которое легко изменить на портативный (война).

Смежные вопросы