在处理具有多个EE可部署项目的项目时,我发现了一个相当复杂的问题。问题似乎是EJB3.1 TimerService的Hibernate依赖项和类加载器隔离不足的汇合。
从库存AS 6 CR1构建开始,我部署了一个WAR。这个WAR包含Hibernate jar。
然后,我在JAR中部署EJB(技术上是MDB)。当我这样做时,JBoss然后启动TimerService,以便提供完整的EJB3.1支持。 TimerService依赖于Hibernate。然后JBoss继续罢工,因为类加载器检测到已经加载的Hibernate版本。
我甚至尝试将其中的每一个打包到一个单独的EAR中并进行部署。没有骰子。有关TimerService加载方式的事情似乎完全忽略了类加载隔离。
我的问题是,除了禁用TimerService之外,我能做些什么吗?我本打算在项目后期使用它的漂亮功能。老实说,我甚至不知道这是不是一个bug,因为JBoss的类加载器文档似乎是由愤怒的Klingons编写的。不过,我希望能够解决这个问题。
编辑 - 事实上,我甚至没有办法禁用TimerService,因为我的每一项努力都以这种或那种方式受到挫败。就目前而言,我没有看到任何人如何将Hibernate和EJB部署到同一个JBoss实例。
编辑 - 我最终设法通过不在我的MDB或WAR中包含Hibernate jar来部署,而是依赖于JBoss的Hibernate实现。这是令人不满意的;我觉得容器和我的豆子之间没有隔离的感觉。但至少它是Hibernate(3.6)的当前版本。
答案 0 :(得分:2)
不确定到目前为止你尝试了什么,但这应该有效:
EAR包含:
还在您的EAR的META-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可以为您提供“应用程序托管”环境,并且它已经提供了一些服务,例如持久性。所以,把这个问题留给AS; - )
答案 1 :(得分:0)
我建议从安装jboss中删除所有hibernate jar的证据。我不知道他们为什么被包括在内 - 导致这些事情发生。 Jboss会先查看自己的库,这样你就一定会遇到冲突。
此外,我知道默认情况下没有配置Jboss4将每个应用程序隔离到自己的类加载器中,因此所有类都是从同一个池加载的。不确定是否仍然如此,但值得研究。在安装jboss时,您可以将其配置为隔离每个应用程序的类加载器(如果您愿意)。虽然如果jboss中有一个hibernate版本,那么common / lib dir隔离类加载器也无济于事。