在使用多个EE部署的项目时,我发现了一个非常复杂的问题。问题似乎是EJB3.1TimerService的Hibernate依赖项和类加载器隔离不足的汇合点。
从6 CR1构建的股票开始,我部署了一个WAR。这场战争包含了冬眠的罐子。
然后,在JAR中部署EJB (技术上是MDB)。当我这样做时,JBoss会启动TimerService,以便提供完整的EJB3.1支持。TimerService依赖于Hibernate。然后JBoss开始罢工,因为类加载器检测到已经加载的Hibernate版本。
我甚至尝试过将它们打包到一个单独的EAR中,并部署它们。没有骰子。TimerService的加载方式似乎完全忽略了类加载隔离。
我的问题是,除了禁用TimerService之外,我还能做些什么吗?我打算在稍后的项目中利用它的巧妙特性。老实说,我甚至不知道这是否是一个bug,因为JBoss的类加载器文档似乎是由愤怒的克林贡人编写的。不过,我还是希望有个解决办法。
编辑--事实上,我甚至没有一种禁用TimerService的方法,因为我的每一项努力都以某种方式被挫败了。目前,我不认为任何人都能将Hibernate和EJB部署到同一个JBoss实例中。
编辑--我最终通过在MDB或WAR中不包括Hibernate WAR来进行部署,而是依赖于JBoss的Hibernate实现。这是令人不满意的;我感到容器和我的bean之间没有隔离。但至少它是Hibernate的最新版本(3.6)。
发布于 2010-12-16 14:32:08
不确定到目前为止您尝试了什么,但这应该是可行的:
耳,含:
need.
并在EAR的META中包含一个JBos-app.xml:
<jboss-app>
<loader-repository>...</loader-repository>
</jboss-app>您可能需要检查这两页:
http://community.jboss.org/wiki/ClassLoadingConfiguration
http://community.jboss.org/wiki/JBossClassLoadingUseCases
但我会重新考虑捆绑你自己版本的Hibernate的决定。虽然这听起来很合理,但是AS可以为您提供一个“应用程序托管”的环境,并且它已经提供了一些服务,比如持久性。所以,让AS来关注这个问题;-)
发布于 2010-12-15 21:27:35
我建议从jboss安装中删除hibernate jars的所有证据。我不知道他们为什么会被包括-导致这种事情发生。Jboss将首先查看它自己的库,因此您肯定会遇到冲突。
此外,我知道Jboss4在默认情况下并不被配置为将每个应用程序隔离到自己的类加载器中,因此所有类都从同一个池中加载。不确定是否仍是这样,但值得调查。在安装jboss时,如果您愿意,可以将其配置为隔离每个应用程序的类加载器。不过,如果JBossCommon/lib中有hibernate的版本,那么隔离类加载器就不会有帮助。
https://stackoverflow.com/questions/4415118
复制相似问题