1

我有几个单独的应用程序项目 (EAR),其中包含多个 EJB,我想将它们部署到同一个 JBoss 服务器。现在,一些项目可能具有相同的 EJB,但版本不同。在类似的情况下,一些项目可能会使用相同“普通”类的不同版本(即在 VM 中加载的类,没有 JNDI 查找)。

使用 OC4J,这似乎不是问题,但现在使用 JBoss,我得到的印象是所有内容都驻留在同一个“名称空间”(或类加载器)中。我在这个假设中正确吗?

基本上,我想做(或确保)有两件事:

  • 从执行 EJB 的 JNDI 查找的客户端,我希望能够指示它驻留在哪个应用程序中,以便返回正确版本的 EJB。

  • 在 EJB 中,当实例化一个类时,我想确保该类是使用与 EJB 相同的应用程序 (EAR) 部署的类。

我想我读到您可以为 EJB 配置一些“隔离”属性,我猜对了,这可能会解决我的第二点吗?

4

2 回答 2

6

JBoss 的默认行为是使用平面类加载器。这减少了占用空间,但正如您所发现的,它使部署多个应用程序变得很麻烦。

值得庆幸的是,修复很容易。在目录中的ear-deployer.xml文件中deploy,确保设置了以下参数:

<attribute name="Isolated">true</attribute>

这将为每个部署的 EAR 提供自己的类加载器空间。它仍然可以访问 JBoss lib 目录中的内容,但部署的 EAR 将彼此不可见。

于 2009-07-17T08:48:37.307 回答
3

您是正确的,来自不同 EAR 的类驻留在同一个“空间”中。JBoss 默认使用扁平的类加载器层次结构,这意味着所有类(WAR 打包的除外)都由同一个类加载器加载。随着 JBoss 5 的引入,有一个严格遵循 Java EE 规则的新标准配置文件,因此支持隔离类加载。较旧的 JBoss 版本还通过部署程序配置中的callByValue隔离属性支持此行为。

于 2009-07-16T18:43:12.767 回答