3.2. 为部署添加 Explicit 模块依赖性

可以在应用中添加显式模块依赖项,将这些模块的类添加到部署时应用的类路径。

注意

JBoss EAP 自动为部署添加一些依赖性。详情请参阅 Implicit 模块依赖项

先决条件

  1. 您要添加模块依赖项的工作软件项目。
  2. 您必须知道添加为依赖项的模块的名称。如需 JBoss EAP 随附的静态模块列表,请参阅 包含的模块。如果模块是另一部署,请参阅 JBoss EAP 配置指南 中的 Dynamic Module Naming,以确定模块名称。

可以使用两种方法配置依赖关系:

  • 向部署的 MANIFEST.MF 文件中添加条目。
  • jboss-deployment-structure.xml 部署描述符中添加条目。

添加依赖配置到 MANIFEST.MF

可以将 Maven 项目配置为在 MANIFEST.MF 文件中创建所需的依赖项条目。

  1. 如果项目没有,请创建名为 MANIFEST.MF 的文件。对于 Web 应用(WAR),将此文件添加到 META-INF/ 目录中。对于 Jakarta Enterprise Beans 存档(JAR),将其添加到 META-INF/ 目录中。
  2. 使用逗号分隔的依赖模块名称列表在 MANIFEST.MF 文件中添加依赖项条目:

    Dependencies: org.javassist, org.apache.velocity, org.antlr
    • 要使依赖项可选,请在依赖项条目中的模块名称中附加 可选

      Dependencies: org.javassist optional, org.apache.velocity
    • 通过将导出附加到依赖项条目中的模块名称,可以 导出 依赖项:

      Dependencies: org.javassist, org.apache.velocity export
    • 当模块依赖项包含在注解扫描期间处理的注解时,如声明 Jakarta Enterprise Beans 拦截器时,需要 annotations 标志。否则,就无法在部署中使用模块中声明的 Jakarta Enterprise Beans 拦截器。当还需要注解扫描时,还有其他情况涉及注解扫描。

      Dependencies: org.javassist, test.module annotations
    • 默认情况下,无法访问依赖项的 META-INF 中的项目。服务 依赖项使来自 META-INF/services 的项目可以访问,以便可以加载模块中的 服务

      Dependencies: org.javassist, org.hibernate services
    • 若要扫描 beans.xml 文件并将其生成的 bean 用于应用程序,可以使用 meta-inf 依赖项。

      Dependencies: org.javassist, test.module meta-inf

添加依赖配置到 jboss-deployment-structure.xml

  1. 如果应用没有,请创建名为 jboss-deployment-structure.xml 的新文件,并将它添加到项目中。此文件是一个 XML 文件,它的根元素为 <jboss-deployment-structure>

    <jboss-deployment-structure>
    
    </jboss-deployment-structure>

    对于 Web 应用(WAR),将此文件添加到 WEB-INF/ 目录中。对于 Jakarta Enterprise Beans 存档(JAR),将其添加到 META-INF/ 目录中。

  2. 在文档根目录和 < dependencies> 元素内创建一个 <deployment > 元素。
  3. <dependencies> 节点中,为每个模块依赖项添加一个模块元素。将 name 属性设置为模块的名称。

    <module name="org.javassist" />
    • 若要使依赖项成为可选的,可以添加 optional 属性到模块条目,值设为 true。此属性的默认值为 false

      <module name="org.javassist" optional="true" />
    • 可以通过将 export 属性添加到值为 true 的模块条目来导出依赖项。此属性的默认值为 false

      <module name="org.javassist" export="true" />
    • 当模块依赖项包含需要在注解扫描过程中处理的注解时,将使用 annotations 标记。

      <module name="test.module" annotations="true" />
    • 服务 依赖项指定是否以及如何使用此依赖项中找到 的服务。默认值为 none。指定此属性的 导入 值等同于在导入过滤器列表末尾添加一个过滤器,其中包括 dependencies 模块的 META-INF/services 路径。为此属性设置 export 值等同于 导出 过滤器列表上的相同操作。

      <module name="org.hibernate" services="import" />
    • META-INF 依赖项指定是否以及如何使用此依赖项中的 META-INF 条目。默认值为 none。为此属性指定 导入 值等同于在导入过滤器列表末尾添加一个过滤器,其中包括 dependencies 模块的 META-INF/** 路径。为此属性设置 export 值等同于 导出 过滤器列表上的相同操作。

      <module name="test.module" meta-inf="import" />

示例:带有两个依赖项的 jboss-deployment-structure.xml 文件

<jboss-deployment-structure>
   <deployment>
      <dependencies>
         <module name="org.javassist" />
         <module name="org.apache.velocity" export="true" />
      </dependencies>
   </deployment>
</jboss-deployment-structure>

JBoss EAP 在部署时将指定模块中的类添加到应用的类路径中。

创建 Jandex Index

annotations 标志要求模块包含 Jandex 索引。在 JBoss EAP 7.4 中,这会自动生成。但是,出于性能的原因,仍建议手动添加索引,因为自动扫描可能是消耗 CPU 并增加部署时间的较长进程。

要手动添加索引,请创建新的"index JAR"以添加到模块中。使用 Jandex JAR 构建索引,然后将它插入到新的 JAR 文件中。在当前的实施中,当索引添加到模块内的 JAR 文件中时,根本不执行扫描。

创建 Jandex 索引:

  1. 创建索引:

    java -jar modules/system/layers/base/org/jboss/jandex/main/jandex-jandex-2.0.0.Final-redhat-1.jar $JAR_FILE
  2. 创建临时工作空间:

    mkdir /tmp/META-INF
  3. 将索引文件移到工作目录

    mv $JAR_FILE.ifx /tmp/META-INF/jandex.idx
    1. 选项 1:在新 JAR 文件中包括索引

      jar cf index.jar -C /tmp META-INF/jandex.idx

      然后,将 JAR 放置到模块目录中,再编辑 module.xml 以将它添加到资源根目录中。

    2. 选项 2:将索引添加到现有 JAR

      java -jar /modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar -m $JAR_FILE
  4. 告知模块导入以使用注解索引,以便注解扫描可以找到注解。

    1. 选项 1:如果您要使用 MANIFEST.MF 添加模块依赖项,请在模块名称后添加 注解。例如,更改:

      Dependencies: test.module, other.module

      Dependencies: test.module annotations, other.module
    2. 选项 2:如果您要根据模块依赖关系添加使用 jboss-deployment-structure.xml 添加 注释="true" 的模块依赖关系。

      注意

      如果应用想要使用静态模块内类中定义的带注解的 Jakarta EE 组件,则需要注释索引。在 JBoss EAP 7.4 中,会自动生成静态模块的注解索引,因此您无需创建它们。但是,您必须告知模块导入以使用注释,方法是将依赖项添加到 MANIFEST.MFjboss-deployment-structure.xml 文件。