如何为ejb home / remote使用global-module类?

时间:2019-01-31 21:17:29

标签: java maven ejb wildfly maven-3

将现有项目迁移到Maven和Wildfly,并不得不移动一些文件来造成以下情况。

  • core.jar
  • ejb1.jar
  • ejb2.jar

ejb1.jar的ejb-jar.xml具有以下内容:

<ejb-jar>
  <enterprise-beans>
    <session id="Value">
      ..
      <home>path.to.ejb1Home</home>
      <remote>path.to.ejb1</remote>
      ...

home和remote标记中引用的类已移至core.jar内部

与此同时,ejb2.jar依赖于core.jar的其他部分。

最简单的解决方案似乎是创建一个全局模块并将core.jar放入其中,创建适当的module.xml并在standalone.sh中条目,以使其可用于所有部署。

module.xml

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.0" name="path.to"> 
  <resources> 
    <resource-root path="core-1.0.jar"/>
  </resources> 
  <dependencies> 
  </dependencies> 
</module>

使用此设置,ejb2.jar会按预期部署,但ejb1.jar会引发以下错误:

Caused by: java.lang.NoClassDefFoundError: Failed to link path.to.ejb1 
    (Module "path.to" from local module loader @4c40b76e (finder: local 
     module finder @2ea6137 (roots: /opt/wildfly/modules, 
     /opt/wildfly/modules/system/layers/base))): javax/ejb/EJBObject

1 个答案:

答案 0 :(得分:0)

您应该仔细考虑您的要求。通常,您不需要提供公共资源(尤其是应用程序接口)作为模块,尤其是作为全局模块。选择适合您需求的解决方案,而不是一眼就不知道其含义的解决方案。

我会按照给定的顺序推荐这些可能性(有关更多信息,请参见Class Loading in Wildfly Documentation

  1. 重新考虑您对不同EAR的要求。随您的EAR提供核心jar作为库。
  2. 即使有多个EAR:也将core.jar作为库提供。这不是多余的,只是分离。
  3. 考虑不使用全局模块。只需安装您的自定义模块。提供一个jboss-deployment-structure.xml文件,将此模块添加为附加依赖项。如果模块包含带注释的类或接口(在部署时应予以考虑),请使用模块依赖项配置设置属性annotations=true
  4. 将全局模块添加到您的配置文件。也许您甚至可以使用“ annotations”属性,但这是我不知道的,我也没有检查。

jboss-deployment-structure.xml文件的示例:

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
      <deployment>
        <dependencies>
          <module name="my.custom.module" export="true" annotations="true"/>
        </dependencies>
      </deployment>
    </jboss-deployment-structure>

编辑:

在安装模块时,请不要忘记为您自己的模块所依赖的其他模块提供传递性模块依赖性。使用您的module.xml文件进行操作。就您而言,您可能至少需要对javax.ejb.api模块有依赖性。