第 3 章 类加载和模块

3.1. 简介

3.1.1. 类加载和模块概述

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

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

3.1.2. 在 Deployment 中加载类

为了进行类加载,JBoss EAP 将所有部署视为模块。它们称为动态模块。根据部署类型,类加载行为会有所不同。

WAR 部署
WAR 部署被视为单个模块。WEB-INF/lib 目录中的类被视为与 WEB-INF/classes 目录中的类相同。WAR 中打包的所有类将加载使用相同的类加载器。
EAR 部署

EAR 部署由多个模块组成,由以下规则定义:

  1. EAR 的 lib/ 目录是名为父模块的单个模块。
  2. EAR 中的每个 WAR 部署都是一个模块。
  3. EAR 中的每个 EJB JAR 部署均是一个模块。

Subdeployment 模块(如 EAR 中的 WAR 和 JAR 部署)对父模块具有自动依赖关系。但是,它们之间没有自动依赖关系。这称为子部署隔离,可以为每个部署或整个应用服务器禁用。

子部署模块之间的显式依赖关系可以通过与任何其他模块相同的方法添加。

3.1.3. 类加载优先级

JBoss EAP 模块类加载程序使用优先级系统来防止类加载冲突。

在部署期间,会为每个部署及其各个依赖项创建完整的软件包和类列表。该列表根据类加载优先级规则排序。在运行时加载类时,类加载程序会搜索此列表,并加载第一个匹配项。这可以防止部署类路径中的相同类和软件包的多个副本相互冲突。

类加载器按照以下顺序加载从高到低的顺序:

  1. 隐式依赖项:这些依赖关系由 JBoss EAP 自动添加,如 Jakarta EE API。这些依赖项具有最高的类加载器优先级,因为它们包含 JBoss EAP 提供的常见功能和 API。

    如需了解有关每个隐式依赖项的完整详情,请参阅 Implicit 模块依赖项

  2. 明确的依赖关系: 这些依赖关系使用应用的 MANIFEST.MF 文件或新的可选 JBoss 部署描述符 jboss-deployment-structure.xml 文件手动添加到应用配置中。

    请参阅为部署添加 Explicit 模块依赖关系以了解如何添加显式依赖项

  3. 本地资源: 这些是打包在部署本身中的类文件,如 WEB-INF/classesWEB-INF/lib 目录。
  4. 部署间依赖关系:它们是 EAR 部署中其他部署的依赖关系。这可以将类包含在 EAR 的 lib 目录中,或者在其他 EJB jars 中定义的类中。

3.1.4. jboss-deployment-structure.xml

jboss-deployment-structure.xml 文件是 JBoss EAP 的可选部署描述符。此部署描述符可对部署中的类加载进行控制。

此部署描述符的 XML 架构位于 EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd 下的产品安装目录中。

可使用此部署描述符执行的关键任务有:

  • 定义显式模块依赖项.
  • 防止特定隐式依赖项加载.
  • 从该部署的资源定义其他模块.
  • 更改 EAR 部署中的子部署隔离行为.
  • 向 EAR 中的模块添加其他资源根.