【问题标题】:JBoss 7.x SAR archive class loading issueJBoss 7.x SAR 归档类加载问题
【发布时间】:2013-04-12 09:20:46
【问题描述】:

我正在尝试构建一个包含 MXBean 的 sar 存档并将其部署在 JBoss 7 中。

直到最近,我在 MXBean 类中引用其他库中的类时遇到问题,因为无论我将它们放在 SAR 存档的哪个位置,JBoss 都不会加载这些库。

我发现可以通过 META-INF 中的 jboss-deployment-structure.xml 文件配置 SAR 的类路径。我的这个文件的版本如下所示:

<jboss-deployment-structure>
<deployment>
    <resources>
        <resource-root path="management.api.jar" />
    </resources>
</deployment>

现在加载了“management.api.jar”中的类。

我现在面临的问题是:如果MXBean的接口存储在management.api.jar中并且实现它的类直接在SAR归档中,那么,当JBoss读取jboss-service时。 xml 并尝试创建 mxbean,它会产生一个指向接口的 ClassNotFoundException(即在 management.api.jar 中)。因此,尽管来自外部 jar 的类加载正常(我通过实际调用一个从 jar 引用类的方法来测试它并且它工作),似乎当 JBoss 注册 bean 时,它并没有通过整个类路径在 jboss-deployment-structure.xml 中定义。

我目前卡住了,我怀疑这是 JBoss 处理类加载方式的错误。如果有人知道解决此问题的方法(除了将接口从 jar 中取出并将其直接放入 SAR 存档中,因为这会破坏整个“api”的想法)请告诉我。

谢谢!

【问题讨论】:

    标签: java classloader jboss7.x jmx mbeans


    【解决方案1】:

    如果我理解正确的话,管理api应该在不同的项目中使用,并且应该在服务器中是全局的。一个简单的解决方法是将您的 jar 放在 jboss 的模块文件夹中。因此,像下面这样创建一个 module.xml,并将其与您的 jar 一起放在 jboss7/modules/yourfolder 中的一个额外文件夹 main 中。 (在模块文件夹中,jboss 7.1 存储所有库。)

     <!-- defines the name of your lib -->
     <module xmlns="urn:jboss:module:1.1" name="yourfolder">
    
    <resources>
        <!-- the jar in your main folder-->
        <resource-root path="management.api.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
     ...dependencies of your api
    </dependencies>
    </module>
    

    然后您可以通过

    从您的 sar-jboss-deployment-structure 加载依赖项

        <dependencies>
          <module name="yourfolder" slot="main" export="true"/>
       </dependencies>
    

    slot=main 表示你使用文件夹 main,你可以添加不同的版本,比如 1.1 等等。 Main也是默认槽,你可以省略它。

    如果您的文件夹结构深入、简单地定义和包含模块,如包。 这样你就可以在 jboss 中定义 api.jars 并从多个项目中引用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2016-01-29
      • 2018-05-07
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多