如何解决两个模块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
相关产品推荐
相关产品推荐

