5.19. 模块类加载更改


在 JBoss EAP 7 中,当多个模块包含相同的类或软件包时,类加载行为发生了变化。

假设 MODULE_A 和 MODULE_B 有两个模块相互依赖,并且包含一些相同的软件包。在 JBoss EAP 6 中,从依赖项加载的类或软件包优先于 module.xml 文件 resource-root 中指定的类或软件包。这意味着 MODULE_A 看到 MODULE_B 和 MODULE_B 的软件包 。这个行为令人困惑,并可能导致冲突。JBoss EAP 7 中已更改此行为。现在,由 module.xml 文件中的 resource-root 指定的类或软件包优先于依赖项指定的类或软件包。这意味着 MODULE_A 看到 MODULE_A 和 MODULE _B 的软件包可以看到 MODULE_B 的软件包。这可防止冲突,并提供更合适的行为。

如果您定义的自定义模块包含 resource-root 库 或软件包,这些模块包含模块依赖项中重复的类,您可能会看到 ClassCastException、LinkageError、类加载错误,或者迁移到 JBoss EAP 7 时的行为更改。要解决这些问题,您必须配置 module.xml 文件,以确保只使用一个类版本。这可以通过以下任一方法实现:

  • 您可以避免指定在模块依赖项中重复类的 resource-root。
  • 您可以使用导入和 导出 元素的 include 和 exclude 子元素来控制 module.xml 文件中的类加载。以下是排除类在指定软件包中的导出元素:

    <exports>
      <exclude path="com/mycompany/duplicateclassespath/"/>
    </exports>

如果您希望保留现有的行为,您必须使用 filter 元素过滤 module.xml 文件中依赖的 resource-root 中的依赖项软件包。这使您可以保留现有的行为,而无需在 JBoss EAP 6 下看到的奇偶环路。以下是过滤指定软件包 中的类的 root 资源示例。

<resource-root path="mycompany.jar">
  <filter>
    <exclude path="com/mycompany/duplicateclassespath"/>
  </filter>
</resource-root>

如需有关模块和类加载的更多信息,请参阅 JBoss EAP 开发指南中的 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/development_guide/#class_loading_and_modules 类加载和模块。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部