JDK 9+ BuiltinClassLoader类路径加载资源失败问题(IntelliJ场景)
解决IntelliJ 2018.1中JPMS模块资源加载失败问题
我之前也踩过JPMS资源加载的类似坑,结合你的描述,问题核心在于IntelliJ 2018.1运行模块主方法时,把编译输出的类路径目录作为模块位置(而非打包后的Jar),导致MyMainClass.class.getResourceAsStream("/some-resource")这类带绝对路径的标准方法无法正确定位资源。下面是几个针对性的解决方案:
1. 改用符合JPMS规范的资源加载方式
模块内的资源查找建议避开带前置斜杠的绝对路径,换成以下两种更可靠的方式:
- 使用相对路径(去掉开头的
/):MyMainClass.class.getResourceAsStream("some-resource") - 直接使用JPMS的Module API(推荐,更贴合模块系统设计):
MyMainClass.class.getModule().getResourceAsStream("some-resource")
这两种方式会直接基于模块的资源上下文查找,不受模块位置是目录还是Jar的影响。
2. 确保IntelliJ正确识别资源目录
如果资源文件没有被IDE正确复制到编译输出目录,也会导致加载失败:
- 右键点击资源所在的目录 → 选择
Mark Directory as→Resources Root - 重新编译模块(
Build → Rebuild Project),确保资源被同步到out/production/[模块名]目录下
3. 调整运行配置的模块路径
检查IntelliJ的运行配置是否正确指向模块资源:
- 打开
Run → Edit Configurations - 找到你的主方法运行配置,切换到
VM options栏 - 确保
--module-path参数指向包含模块编译输出(含资源)的目录,而非仅类路径。例如:--module-path /home/christopher/IdeaProjects/systematik-catalogue-builder/web-anno/out/production --module org.ubl.scb/your.package.MyMainClass
4. 尝试打包模块后运行
如果上述方法都无效,可以先将模块打包成Jar再运行:
- 通过
Build → Build Artifacts生成模块Jar - 用命令行或IDE运行打包后的Jar,此时
ModuleReference会正确指向Jar文件,资源加载逻辑会恢复正常
内容的提问来源于stack exchange,提问作者Christopher Johnson
相关产品推荐
相关产品推荐

