第 6 章 JBoss EAP 类加载

JBoss EAP 使用模块化类加载系统来控制已部署应用的类路径。这个系统比传统的分层类加载器系统提供更多灵活性和控制力。开发人员对其应用可用的类有精细的控制,并且可以配置部署来忽略应用服务器提供的类,而非自有的类。

模块类加载器将所有 Java 类划分为称为模块的逻辑组。每个模块可以定义对其他模块的依赖关系,以便将该模块中的类添加到其自己的类路径中。由于每个部署的 JAR 和 WAR 文件都被视为模块,因此开发人员可以通过在其应用中添加模块配置来控制其应用的类路径的内容。

6.1. 模块

模块是用于类加载和依赖关系管理的逻辑类分组。JBoss EAP 识别两种不同类型的模块: 静态 和动态。这两者之间的主要区别在于如何打包它们。

静态模块

静态模块在应用服务器的 EAP_HOME/modules/ 目录中定义。每个模块都作为子目录存在,例如 EAP_HOME/modules/com/mysql/。每个模块目录随后包含一个插槽子目录,默认为 main,它包含 module.xml 配置文件以及任何所需的 JAR 文件。所有应用程序服务器提供的 API 都作为静态模块提供,包括 Jakarta EE API 以及其他 API。

示例:MySQL Java 数据库连接(JDBC)Driver module.xml 文件

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-8.0.12.jar"/>
  </resources>
  <dependencies>
    <module name="javaee.api"/>
    <module name="sun.jdk"/>
    <module name="ibm.jdk"/>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

模块名称 com.mysql 必须与模块的目录结构匹配,不包括插槽名称 main

如果许多应用部署在使用相同的第三方库的同一服务器上,创建自定义静态模块非常有用。管理员可以创建和安装包含这些库的模块,而不是将这些库与各个应用捆绑在一起。然后,应用可以声明对自定义静态模块的显式依赖关系。

JBoss EAP 分发中提供的模块位于 EAP_HOME/modules 目录中的 系统 目录中。这使它们与第三方提供的任何模块相隔离。任何红帽都在 JBoss EAP 基础上提供的产品也会将其模块安装到 系统 目录中。

用户必须确保自定义模块安装至 EAP_HOME/modules 目录中,每个模块使用一个目录。这可确保加载 系统 目录中已存在的模块自定义版本,而不是所附带的版本。这样,用户提供的模块优先于系统模块。

如果您使用 JBOSS_MODULEPATH 环境变量更改 JBoss EAP 搜索模块的位置,则产品将在指定的位置之一内查找 系统 子目录结构。系统 结构必须存在于通过 JBOSS_MODULEPATH 指定的位置。

注意

从 JBoss EAP 7.1 开始,还支持在 module.xml 文件的 resource-root path 元素中使用绝对路径。这样,就可以访问您的资源库,而无需将它们移到 EAP_HOME/modules 目录。

示例: module.xml 文件中的 Absolute Path

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="oracle.jdbc">
    <resources>
        <resource-root path="/home/redhat/test.jar"/>
    </resources>
</module>

动态模块

动态模块由应用服务器为每个 JAR 或 WAR 部署创建和加载,或者针对 EAR 中的每个子部署创建和加载。动态模块的名称派生自部署存档的名称。由于部署是作为模块加载的,所以它们可以配置依赖项,供其他部署用作依赖项。

只有在需要时才加载模块。这通常仅在部署具有显式或隐式依赖项的应用时才发生。

预定义模块

从 JBoss EAP 7.2 开始,当您使用默认模块加载程序时,可以使用一组预定义模块。包括所有 JBoss 模块 API 的特殊模块 org.jboss.modules 始终可用,并由 JBoss 模块提供。标准 Java 平台模块系统(JPMS)模块(Java 9 及更高版本中提供)也可通过其标准名称提供。使用 JDK 8 时,JDK 9 模块由 JBoss 模块模拟。

有关 Java 9 或更高版本中可用平台模块列表,请参阅相应的 JDK 文档。

有关为 Java 8 提供的平台模块列表,请参阅 为 Java 8 提供的平台模块