Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

第 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 都作为静态模块提供,包括 Java EE API 和其他 API。

MySQL 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-5.1.36-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

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

如果很多应用程序都使用相同的第三方库的同一服务器上,创建自定义静态模块会很有用。管理员可以由管理员创建并安装这些库,而不是将这些库与每个应用绑定。然后,应用程序可以声明对自定义静态模块的明确依赖。

JBoss EAP 分发中提供的模块位于 EAP_HOME/modules 目录中的 系统 目录中。这样会使它们与第三方提供的任何模块分开。任何在 JBoss EAP 之上提供的产品也将其模块安装到 系统 目录中。

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

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

动态模块

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

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