在处理具有多个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版本将无济于事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top