首页 文章

将相同EJB和类的多个版本部署到同一JBoss服务器

提问于
浏览
1

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

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

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

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

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

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

2 回答

  • 6

    你're correct that classes from different EAR'驻留在同一个"space" . JBoss默认使用平面类加载器层次结构,这意味着所有类(WAR打包的类除外)都由同一个类加载器加载 . 随着JBoss 5的推出,有一个新的标准配置文件严格遵循Java EE规则,因此支持隔离的类加载 . 较旧的JBoss版本也通过callByValue支持此行为,并在部署程序配置中隔离属性 .

  • 3

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

    谢天谢地,修复很简单 . 在 deploy 目录的 ear-deployer.xml 文件中,确保设置了以下参数:

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

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

相关问题