2010-12-11 4 views
3

Я нашел довольно сложную проблему при работе над проектом с несколькими развертываниями EE. Проблема заключается в слиянии зависимостей Hibernate от TimerService EJB3.1 и недостаточной изоляции загрузчика классов.Проблема с загрузчиком Classloader в JBoss AS 6 с развертыванием EJB и WARs бок о бок

Начиная с запаса AS 6 CR1 build, я развертываю WAR. Эта WAR содержит баки Hibernate.

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

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

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

EDIT - На самом деле, у меня даже нет возможности отключить TimerService, так как каждое из моих усилий было так или иначе сорвано. Как бы то ни было, я не вижу, как каждый может развернуть Hibernate и EJB в одном экземпляре JBoss.

EDIT - В конечном итоге мне удалось развернуть, не включая баки Hibernate в моем MDB или WAR, но полагаться на реализацию Hibernate JBoss. Это неудовлетворительно; У меня осталось ощущение, что между контейнером и моими бобами нет никакой изоляции. Но, по крайней мере, это текущая версия Hibernate (3.6).

ответ

2

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

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

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

А также включают в себя JBoss-приложение.XML в ушном в META-INF:

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

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

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

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

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

+0

На данный момент мы перестали связываться в Hibernate как наше решение этой проблемы, полагаясь вместо этого на включение JBoss JAR. Две причины, которые заставляют меня немного неудобно: а) если в какой-то момент в будущем мы перейдем к другой версии Hibernate и b), что обнаженные EJB/MDB (в JAR, а не в EAR) не кажутся работать с этим. Думаю, есть проблемы с classpath с поиском файлов XML в JAR? Спасибо за ссылки на материал загрузчика классов; Я определенно посмотрю на них. –

0

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

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

+0

Я попробую это, но я думаю, что если я удалю JARs Hibernate из JBoss, то TimerService, который зависит от них, может сломаться. Правда, только эксперименты могут сказать наверняка. –

+0

* Я не знаю, почему они включены * - возможно, это потому, что JBoss AS реализует Java EE, JPA является официальной частью Java EE, а JBoss реализует JPA с Hibernate? Просто мысль. –

+0

У вас, вероятно, есть точка в Jboss AS 6, но я имел в виду jboss 4. Хотя, если вы хотите использовать другую версию спящего режима, которая поставляется с jboss? JPA (в отличие от EJB 2.1) не требует жесткой связи между реализацией JPA и сервером приложений. –

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