3

在处理具有多个 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,我能做些什么吗?我打算在项目的后期使用它的漂亮功能。老实说,我什至不知道这是否是一个错误,因为 JBoss 的类加载器文档似乎是由愤怒的克林贡人编写的。不过,我希望有一个解决方法。

编辑- 事实上,我什至没有办法禁用 TimerService,因为我的每一项努力都以某种方式受挫。就目前而言,我看不出任何人如何将 Hibernate 和 EJB 部署到同一个 JBoss 实例。

编辑- 我最终设法通过不在我的 MDB 或 WAR 中包含 Hibernate jar 来进行部署,而是依赖 JBoss 的 Hibernate 实现。这令人不满意;我觉得容器和我的豆子之间没有隔离。但至少它是当前版本的 Hibernate (3.6)。

4

2 回答 2

2

不确定到目前为止您已经尝试过什么,但这应该可以:

EAR 包含:

  • EJB 的 JAR
  • JPA 的 JAR
  • webapp 的 WAR
  • 您需要的所有库。
  • jboss-app.xml,具有独特的“加载器存储库”

并且还在你的 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 ;-)

于 2010-12-16T14:32:08.263 回答
0

我建议从 jboss 的安装中删除所有休眠 jar 的证据。我不知道为什么它们被包括在内 - 导致这类事情发生。Jboss 会先查看它自己的库,所以你肯定会遇到冲突。

此外,我知道 Jboss4 没有默认配置为将每个应用程序隔离到自己的类加载器中,因此所有类都从同一个池中加载。不确定是否仍然如此,但值得调查。在安装 jboss 时,如果您愿意,您可以将其配置为隔离每个应用程序的类加载器。虽然如果在 jboss common/lib 目录中有一个休眠版本,那么隔离类加载器将无济于事。

于 2010-12-15T21:27:35.097 回答