Проблема загрузчика классов в JBoss AS 6 с EJB и WAR, развернутыми бок о бок - PullRequest
3 голосов
/ 11 декабря 2010

Я обнаружил довольно сложную проблему при работе над проектом с несколькими внедряемыми EE. Кажется, проблема в слиянии зависимостей Hibernate EJB3.1 TimerService и недостаточной изоляции загрузчика классов.

Начиная со стандартной сборки AS 6 CR1, я развернул WAR. Эта WAR содержит банки Hibernate.

Затем я развертываю EJB (технически MDB) в JAR. Когда я это делаю, JBoss запускает TimerService, чтобы обеспечить полную поддержку EJB3.1. TimerService зависит от Hibernate. Затем JBoss бастует, потому что загрузчик классов обнаруживает уже загруженную версию Hibernate.

Я даже пытался упаковать каждый из них в отдельный EAR и развернуть их. Нет кости. Что-то в том, как загружается TimerService, похоже, полностью игнорирует изоляцию загрузки классов.

У меня вопрос, могу ли я что-нибудь с этим сделать, кроме отключения службы TimerService? Я собирался использовать его изящные функции позже в проекте. Честно говоря, я даже не знаю, является ли это ошибкой, поскольку документация загрузчика классов для JBoss, кажется, была написана злыми клингонами. Тем не менее, я надеюсь на обходной путь.

РЕДАКТИРОВАТЬ - На самом деле, у меня даже нет способа отключить TimerService, так как все мои усилия были сорваны так или иначе. В настоящее время я не понимаю, как кто-либо может развернуть Hibernate и EJB в одном экземпляре JBoss.

РЕДАКТИРОВАТЬ - Мне удалось развернуть, не включив файлы Jibernate в мой MDB или WAR, но полагаясь на реализацию JBoss Hibernate. Это неудовлетворительно; У меня осталось ощущение, что нет никакой изоляции между контейнером и моими бобами. Но, по крайней мере, это текущая версия Hibernate (3.6).

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Не уверен, что вы уже пробовали, но это должно работать:

EAR, содержащий:

  • JAR для EJB
  • JAR для JPA
  • WAR для веб-приложения
  • Все библиотеки вам нужны.
  • jboss-app.xml, с уникальным «хранилищем-загрузчиком»

А также включите jboss-app.xml в META-INF вашего EAR:

<jboss-app>
  <loader-repository>...</loader-repository>
</jboss-app>

Вы можете проверить эти две страницы:

http://community.jboss.org/wiki/ClassLoadingConfiguration

http://community.jboss.org/wiki/JBossClassLoadingUseCases

Но я бы пересмотрел решение о комплектации вашей собственной версии Hibernate. Хотя это может показаться разумным, AS предоставляет вам среду «хостинга приложений» и уже предоставляет некоторые услуги, такие как постоянство. Итак, оставьте это беспокойство AS; -)

0 голосов
/ 16 декабря 2010

Я бы предложил удалить все свидетельства гибернации jars из установки jboss.Я не знаю, почему они включены - приводит к тому, что такие вещи случаются.Jboss сначала будет искать в своих собственных библиотеках, так что вы неизбежно получите конфликты.

Более того, я знаю, что Jboss4 не был настроен по умолчанию для изоляции каждого приложения в своем собственном загрузчике классов, поэтому все классы были загружены из одного пула,Не уверен, что это все еще так, но это стоит расследовать.При установке jboss вы можете настроить его так, чтобы изолировать загрузчик классов каждого приложения, если хотите.Хотя, если есть версия hibernate в директории jboss common / lib, изоляция загрузчиков классов не поможет.

...