JBoss AS 6中的类加载器问题,并行部署了EJB和WAR

时间:2010-12-11 03:56:30

标签: hibernate jboss timer classloader jboss6.x

在处理具有多个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)的当前版本。

2 个答案:

答案 0 :(得分:2)

不确定到目前为止你尝试了什么,但这应该有效:

EAR包含:

  • EJB的JAR
  • JPA的JAR
  • 针对webapp的WAR
  • 您需要的所有图书馆。
  • jboss-app.xml,带有独特的“loader-repository”

还在您的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隔离类加载器也无济于事。