3.7. 类加载和子部署


3.7.1. 企业存档中的模块和类加载

企业存档(EAR)不作为单一模块加载,如 JAR 或 WAR 部署。它们作为多个唯一模块载入。

以下规则决定了 EAR 中存在的模块:

  • EAR 存档根目录中的 lib/ 目录的内容是一个模块。这称为父模块。
  • 每个 WAR 和 Jakarta Enterprise Beans JAR 子部署都是一个模块。这些模块具有与任何其他模块相同的行为,以及对父模块的隐式依赖项。
  • Subdeployments 对父模块和其他任何非 WAR 子部署具有隐式依赖项。

存在对非 WAR 子部署的隐式依赖关系,因为 JBoss EAP 默认禁用子部署类加载器隔离。无论子部署类加载器隔离如何,对父模块的依赖关系都会保留。

重要

没有子部署获得对 WAR 子部署的隐式依赖性。任何子部署都可以像任何其他模块一样,为另一个子部署配置明确的依赖关系。

如果需要严格兼容性,则可启用 Subdeployment 类加载器隔离。这可以在单个 EAR 部署或所有 EAR 部署中启用。Jakarta EE 规范建议,便携式应用不应依赖于子部署相互访问,除非在每个子部署的 MANIFEST.MF 文件中明确声明依赖项为 Class-Path 条目。

3.7.2. 子部署类加载器隔离

企业存档(EAR)中的每个子部署是一个具有自己的类加载器的动态模块。默认情况下,子部署可以访问其他子部署的资源。

如果子部署不允许访问其他子部署的资源,则可以启用严格的子部署隔离。

3.7.3. 在 EAR 中启用子部署类加载器隔离

此任务演示了如何在 EAR 部署中使用特殊的部署描述符在 EAR 部署中启用子部署类加载器隔离。这不需要对应用服务器进行任何更改,也不会影响任何其他部署。

重要

即使子部署类加载器隔离已被禁用,也无法添加 WAR 部署作为依赖项。

  1. 添加部署描述符文件。

    jboss-deployment-structure.xml 部署描述符文件添加到 EAR 的 META-INF 目录中(如果它尚不存在),并添加以下内容:

    <jboss-deployment-structure>
    
    </jboss-deployment-structure>
    Copy to Clipboard Toggle word wrap
  2. 添加 <ear-subdeployments-isolated> 元素。

    如果 jboss- deployment-structure.xml 文件的内容不存在,请将 <ear -subdeployments-isolated> 元素 添加到 jboss-deployment-structure.xml 文件中

    <ear-subdeployments-isolated>true</ear-subdeployments-isolated>
    Copy to Clipboard Toggle word wrap

现在,为这个 EAR 部署启用了 Subdeployment 类装载程序隔离。这意味着,EAR 的子部署不会对每个非 WAR 子部署具有自动依赖项。

JBoss EAP 提供配置企业存档(EAR)在 EAR 中包含的 WAR 模块子部署之间共享会话的功能。默认情况下禁用此功能,必须在 EAR 的 META-INF/jboss-all.xml 文件中明确启用。

重要

由于此功能不是标准 servlet 功能,如果启用此功能,您的应用程序可能无法移植。

要在 EAR 中启用 WAR 之间的会话共享,您需要在 EAR 的 META -INF/jboss-all.xml 中声明 shared- session-config 元素:

示例: META-INF/jboss-all.xml

<jboss xmlns="urn:jboss:1.0">
  ...
  <shared-session-config xmlns="urn:jboss:shared-session-config:2.0">
  </shared-session-config>
  ...
</jboss>
Copy to Clipboard Toggle word wrap

shared-session-config 元素用于为 EAR 中的所有 WAR 配置共享会话管理器。如果存在 shared-session-config 元素,则 EAR 内的所有 WAR 将共享相同的会话管理器。此处所做的更改将影响 EAR 中包含的所有 WAR。

3.7.4.1. 共享会话配置选项参考

示例: META-INF/jboss-all.xml

<jboss xmlns="urn:jboss:1.0">
    <shared-session-config xmlns="urn:jboss:shared-session-config:2.0">
    	<distributable/>
        <max-active-sessions>10</max-active-sessions>
        <session-config>
            <session-timeout>0</session-timeout>
            <cookie-config>
                <name>JSESSIONID</name>
                <domain>domainName</domain>
                <path>/cookiePath</path>
                <comment>cookie comment</comment>
                <http-only>true</http-only>
                <secure>true</secure>
                <max-age>-1</max-age>
            </cookie-config>
            <tracking-mode>COOKIE</tracking-mode>
        </session-config>
        <replication-config>
            <cache-name>web</cache-name>
            <replication-granularity>SESSION</replication-granularity>
        </replication-config>
    </shared-session-config>
</jboss>
Copy to Clipboard Toggle word wrap

Expand
元素描述

shared-session-config

共享会话配置的根元素.如果 META-INF/jboss-all.xml 中存在,则 EAR 中包含的所有部署 WAR 都将共享单个会话管理器。

distributable

指定应使用可分布式会话管理器。从 schema 版本 2.0 开始,默认使用一个不可分发的会话管理器。对于版本 1.0,distributable 会话管理器仍然是默认的会话管理器。

max-active-sessions

允许的最大会话数.

session-config

包含 EAR 中包含的所有已部署 WAR 的会话配置参数。

session-timeout

为 EAR 中包含的部署的 WAR 中创建的所有会话超时间隔定义默认的会话超时间隔。指定的超时必须以整分钟表示。如果超时为 0 或以下,容器可确保会话的默认行为永不超时。如果没有指定此元素,容器必须设置其默认超时期限。

cookie-config

包含由 EAR 中包含的部署的 WAR 创建的会话跟踪 Cookie 的配置。

name

分配给 EAR 中所含部署的 WAR 创建的任何会话跟踪 Cookie 的名称。默认值为 JSESSIONID

domain

分配给 EAR 中所含部署的 WAR 创建的任何会话跟踪 Cookie 的域名。

路径

分配给 EAR 中所含部署的 WAR 创建的任何会话跟踪 Cookie 的路径。

注释

分配给 EAR 中所含部署的 WAR 创建的任何会话跟踪 Cookie 的注释。

http-only

指定 EAR 中包含的已部署 WAR 创建的任何会话跟踪 Cookie 是否标记为 HttpOnly

安全

指定任何由 EAR 中包含的部署的 WAR 创建的会话跟踪 Cookie 是否会被标记为安全,即使发起对应会话的请求使用普通 HTTP 而不是 HTTPS。

max-age

分配给由 EAR 中包含的部署的 WAR 创建的任何会话跟踪 Cookie 的生命周期(以秒为单位)。默认值为 -1

tracking-mode

定义由 EAR 中包含的部署的 WAR 创建的会话的跟踪模式。

replication-config

包含 HTTP 会话集群配置。

cache-name

这个选项仅适用于集群。它指定 Infinispan 容器的名称,以及用于存储会话数据的缓存。默认值(如果未明确设置)由应用服务器决定。要在缓存容器内使用特定的缓存,请使用 container.cache 形式,如 web.dist。如果 name 不限定,则使用指定容器的默认缓存。

复制 -granularity

这个选项仅适用于集群。它决定了会话复制粒度级别。可能的值有 SESSIONATTRIBUTE,其中 SESSION 是默认值。

如果使用了 SESSION 粒度,则在请求范围内修改了任何会话属性,则会复制所有会话属性。如果对象引用由多个会话属性共享,则需要此策略。但是,如果会话属性足够大和/或不常修改,则这可能会低效,因为无论是否修改了所有属性,都必须复制所有属性。

如果使用 ATTRIBUTE 粒度,则仅复制在请求范围内修改的属性。如果对象引用由多个会话属性共享,则此策略不合适。如果会话属性足够大和/不频繁地修改,则这比 SESSION 粒度更高。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部