EJBs 2.0 на OpenEJB — куда поместить необходимые jar-файлы?

До сих пор мы использовали WAS 6.1 для развертывания наших веб-приложений. Теперь нам нужно перейти на экономичное решение Tomcat + OpenEJB. Контейнер OpenEJB 3.1.2 подключен к Tomcat 6.18, здесь нет отдельного сервера OpenEJB.

Итак, я пытаюсь развернуть свои объекты EJB 2.1 в OpenEJB...

Моя проблема в том, что для кода EJBs требуются внешние библиотеки .jar, и я не знаю, куда их поместить, чтобы они действительно учитывались в пути к классам контейнера. Он отлично работает в catalina.home/lib, так же как и в openejb.home/lib. Но все же я бы предпочел найти способ упаковать EJB так, чтобы их было легко развернуть, а связанные с ними файлы .jar были помещены прямо на место для использования контейнером OpenEJB.

Это может включать в себя создание .ear или .jar с правильными файлами дескрипторов... Любое работающее решение мне достаточно.

Может кто поможет?


person Julian    schedule 14.10.2010    source источник
comment
Я думаю, что tomcat_home/lib - это способ избежать проблем с загрузчиком классов. См. usna86-techbits.blogspot.com /2009/12/   -  person JoseK    schedule 14.10.2010
comment
@JoseK Я думаю, что эта конкретная проблема была связана с включением библиотек javax в веб-приложение. Большинство из них добавляются через jar-файл javaee-api, поставляемый с OpenEJB. Другие сторонние библиотеки должны быть в порядке. Обязательно дайте мне знать, если вы испытали иначе.   -  person David Blevins    schedule 14.10.2010


Ответы (2)


Ушной подход

Вы можете просто поместить его в каталог Tomcat webapps/, и он будет выбран.

Пример уха (действительный):

myapplication.ear
  lib/
  lib/libraryOne.jar
  lib/libraryTwo.jar
  redEjbs.jar
  blueEjbs.jar

Распространенная ошибка (неверно):

myapplication.ear
  libraryOne.jar  (err. not a javaee module)
  libraryTwo.jar  (err. not a javaee module)
  redEjbs.jar
  blueEjbs.jar

В корне разрешены только модули Java EE. Это JAR-файлы EJB, файлы .war, RAR-файлы Connector и JAR-файлы Application Client. До Java EE 5 библиотеки должны были быть явно перечислены в файле application.xml. В Java EE 5 и более поздних версиях они могут быть добавлены в каталог lib/ и восприниматься как обычные jar-файлы, а не как модуль Java EE.

Свернутый метод EAR

В OpenEJB/Tomcat вы можете поместить все свои библиотеки в военный файл и избавиться от концепции уха. Теперь это часть Java EE 6.

mywebapp.war
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/libraryTwo.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

Распространенная ошибка, включая спецификации:

mywebapp.war
  WEB-INF/lib/javax.ejb.jar   (err. clashes with the related system library)
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/libraryTwo.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

Не похоже, что это проблема, но добавление для полноты.

Распространенная ошибка, сломанные зависимости:

tomcat/lib/libraryTwo.jar

mywebapp.war
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

Вышеприведенное не является недействительным с точки зрения спецификации и не может быть обнаружено сервером, но все же может привести к неправильной загрузке приложений. Если для libraryTwo.jar нужны классы в libraryOne.jar, то это приложение никогда не будет работать, поскольку загрузчик классов Tomcat «lib» не может видеть классы из загрузчика классов «webapp», поэтому классы из libraryTwo.jar никогда не будут успешно загружены. К сожалению, виртуальная машина почти никогда не скажет фактический отсутствующий класс, а вместо этого сообщит о первом классе в цепочке событий, которые привели к необходимости отсутствующего класса. Это почти всегда класс компонента или сервлета.

person David Blevins    schedule 14.10.2010
comment
Нет, не сработает... Мой EJB опирается на класс, который находится в другом .jar. Я безуспешно пытался поместить этот .jar в несколько мест: в корень .ear, в корень .war, в папку .war WEB-INF/lib... Когда я запускаю Tomcat server Я продолжаю иметь этот «java.lang.NoClassDefFoundError: не удалось полностью загрузить класс: eu.partecis.proxya.ejb.autorisation.UcAutorisationBean из-за: исключения EvtAutorisationRechercheBean в classLoader: (yadayada)». - person Julian; 14.10.2010
comment
Ставить сторонние библиотеки в корень уха или войны недопустимо. WEB-INF/lib должен был работать, если ваш ejb jar находился в том же каталоге WEB-INF/lib. Расширит ответ, чтобы показать некоторые гипотетические примеры. Если бы вы могли расширить вопрос, чтобы показать все настоящие банки, с которыми вы работаете, это было бы здорово. - person David Blevins; 15.10.2010

Спасибо, Дэвид. Я пробовал все вышеперечисленное, но все равно не повезло. Я думаю, подход Collapsed EAR не сработает, поскольку, насколько я знаю, Tomcat 6.0.18 не соответствует спецификациям J2EE 6. Может я и ошибаюсь, но я пробовал и все равно не получилось. Итак, вернемся к стандартному подходу EAR.

Мой EAR организован именно так, как описано в вашем самом первом примере. Один jar-файл Ejb, два jar-файла библиотеки в /lib, и все. Tomcat по-прежнему не может создать экземпляр моего EJB, потому что класс EJB относится к недостижимому классу из библиотеки Jar Two.

Я упростил свой файл application.xml, чтобы он объявлял только один единственный EJB:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ...>
<application>
  <display-name>ProxyaEAR</display-name>
  <module id="EjbModule">
     <ejb>ProxyaEJB.jar</ejb>
  </module>
</application>

Есть еще мысли??

person Julian    schedule 15.10.2010
comment
Примеры в другом посте не имели дескриптора. Если у вас есть дескриптор, вы должны явно перечислить все свои jar-файлы с помощью ‹module›‹java›myLibrary.jar‹/java›‹/module› для каждой сторонней библиотеки. - person David Blevins; 16.10.2010