我有几个单独的应用程序项目(EAR),包含多个EJB,我想将它们部署到同一个JBoss服务器上。现在,一些项目可能具有相同的EJB,但版本不同。在类似的情况下,一些项目可能使用相同“普通”类的不同版本(即在VM中加载的类,没有JNDI查找)。
使用OC4J,这似乎不是一个问题,但现在使用JBoss,我得到的印象是所有内容都位于相同的“名称空间”(或类加载器)。我在这个假设中是否正确?
基本上,我想做(或确保)的是两件事:
从执行EJB的JNDI查找的客户端,我希望能够指出它所在的应用程序,以便返回正确的EJB版本。
在EJB中,当实例化一个类时,我想确保该类是使用与EJB相同的应用程序(EAR)部署的类。
我想我读过你可以为EJB配置一些“隔离”属性,我猜错了可能会解决我的第二点吗?
答案 0 :(得分:6)
JBoss的默认行为是使用平面类加载器。这样可以减少占用空间,但正如您所发现的那样,它会使部署多个应用程序变得麻烦。
谢天谢地,修复很简单。在ear-deployer.xml
目录的deploy
文件中,确保设置了以下参数:
<attribute name="Isolated">true</attribute>
这将为每个部署的EAR提供自己的类加载器空间。它仍然可以从JBoss lib目录访问东西,但是部署的EAR彼此是不可见的。
答案 1 :(得分:3)
来自不同EAR的类位于同一“空间”中,这是正确的。 JBoss默认使用 flat classloader hierarchy ,这意味着所有类(WAR打包的类除外)都由同一个类加载器加载。随着JBoss 5的推出,有一个新的标准配置文件严格遵循Java EE规则,因此支持隔离的类加载。较旧的JBoss版本也通过部署程序配置中的 callByValue 和 isolate 属性支持此行为。