JBOSS中的ClassLoader问题与EJB和战争并排部署
-
08-10-2019 - |
题
在处理具有多个EE Deployables的项目时,我发现了一个非常复杂的问题。这个问题似乎是EJB3.1 TimerService的休眠依赖性和类载荷隔离的汇合。
从股票为6 CR1的构建开始,我部署了一场战争。这场战争包含冬眠罐。
然后,我将EJB(从技术上讲是MDB)在罐子中部署。当我这样做时,JBOSS然后启动TimerService,以提供完整的EJB3.1支持。计时服务取决于冬眠。然后,JBOSS进行罢工,因为ClassLoader检测到已经加载的Hibernate版本。
我什至尝试将它们包装成一个单独的耳朵并部署它们。没有骰子。关于计时服务的加载方式似乎完全忽略了类隔离。
我的问题是,缺乏计时服务我该怎么办?我打算以后在项目中使用其漂亮的功能。老实说,我什至不知道这是否是一个错误,因为JBOSS的Classloader文档似乎是由Angry Klingons撰写的。不过,我希望有一个工作。
编辑 - 实际上,我什至没有一种禁用时间服务的方式,因为我的每项努力都以一种或另一种方式挫败了。就目前而言,我看不到任何人如何将Hibernate和EJB部署到同一JBOSS实例。
编辑 - 最终,我设法通过不包括MDB或战争中的Hibernate Jars进行部署,而是依靠JBoss的Hibernate实施。这是不满意的;我觉得容器和豆子之间没有隔离。但至少这是当前版本的休眠(3.6)。
解决方案
不确定到目前为止您尝试过什么,但这应该起作用:
含有的耳朵:
- 罐子为ejbs
- 罐子JPA
- WebApp的战争
- 您需要的所有lib。
- jboss-app.xml,带有唯一的“加载器固定器”
并在您的耳朵的元I-Inf中包含jboss-app.xml:
<jboss-app>
<loader-repository>...</loader-repository>
</jboss-app>
您可能需要检查这两页:
http://community.jboss.org/wiki/classloadingconfiguration
http://community.jboss.org/wiki/jbossclassloadingusecases
但是我会重新考虑捆绑您自己版本的Hibernate的决定。虽然听起来很合理,但在那里为您提供“应用程序托管”的环境,并且已经提供了一些服务,例如持久性。因此,将这个关注点留给AS ;-)
其他提示
我建议从JBOSS的安装中删除所有冬眠罐的证据。我不知道为什么会包括 - 导致这些事情发生。 JBOSS将首先查看自己的库,因此您一定会遇到冲突。
此外,我知道默认情况下没有配置JBOSS4将每个应用程序隔离到其自己的ClassLoader中,因此所有类都从同一池加载。不确定是否仍然是这种情况,但值得调查。 JBOSS安装时,您可以将其配置为隔离每个应用程序的类加载程序,如果您希望。虽然,如果JBOSS COMMON/LIB DIR隔离班级装载器中的Hibernate版本将无济于事。