0

我正在尝试构建一个包含 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”的想法)请告诉我。

谢谢!

4

1 回答 1

0

当我理解正确时,管理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 并从多个项目中引用它。

于 2013-04-12T09:46:31.063 回答