You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决两个模块Jar同名资源文件夹冲突 实现资源正常加载与模块启动

Java模块系统多模块同名资源目录冲突解决方案

你遇到的报错如下:

Error occurred during initialization of boot layer
java.lang.LayerInstantiationException: Package images in both module A and module B

冲突根因

Java 9+的JPMS(Java平台模块系统)规则明确禁止不同模块包含同名的公开包。而模块系统默认会将JAR根目录下所有名称不含.的子目录统一识别为Java包,无论目录中是否存放.class类文件,因此你两个模块中作为资源目录的images文件夹被判定为同名包,触发启动校验失败。

可行解决方法

方案1:调整资源目录结构(最推荐,适配模块系统规范)

修改任意一个或两个模块的资源目录结构,避免出现无点的同名根目录:

  • 方案1a:给资源目录增加模块专属的层级,比如模块A的资源路径调整为com/example/moda/images/,模块B的调整为com/example/modb/images/,后续读取资源时对应修改资源路径即可。
  • 方案1b:直接给资源目录名加上.,比如重命名为images.res,只要目录名包含.,模块系统就不会将其判定为Java包,不会触发同名包校验。

方案2:启动参数强制合并包(仅适合临时调试)

如果无法修改JAR包结构,可以在启动命令中添加--patch-module参数,将其中一个模块的images包合并到另一个模块的命名空间下,示例命令如下:

java --patch-module A=B.jar --module-path <你的模块路径> --module <主模块全限定名>

该方案会将模块B中images目录的所有内容归到模块A的类加载路径下,读取资源时需要注意类加载器的选择,不推荐生产环境使用。

方案3:切换到类路径运行

如果你的项目不需要用到模块系统的隔离能力,可以将两个JAR包从module-path移到classpath下启动,类路径不会做同名包的冲突校验,完全兼容旧版本Java的资源加载逻辑。

内容的提问来源于stack exchange,提问作者Zach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:36:01