【问题标题】:Deploying multiple versions of same EJBs and classes to same JBoss server将相同 EJB 和类的多个版本部署到同一个 JBoss 服务器
【发布时间】:2009-07-16 18:21:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: deployment jboss ejb jndi classloader


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您提供信息丰富的回复!我最终选择了 Kettelerijs 的回复作为接受的答案,但您的回复也非常有用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-19
      • 2010-12-05
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多