IntelliJ中Gradle构建库被非Gradle应用引用时资源加载失败求助
解决Gradle构建库在IntelliJ中资源加载失败的问题
问题原因
你当前用this.getClass().getResource("sample.properties")加载资源时,这个方法会相对于当前类所在的包路径查找资源。比如你的类在mypackage下,它会去类路径的mypackage/sample.properties位置查找,但Gradle构建时把资源文件放在了类路径根目录(build/resources/main),和类文件所在的build/classes/java/main/mypackage不在同一层级,所以找不到资源。而Eclipse能正常工作是因为它默认把类和资源都输出到同一个目录,相对路径自然能匹配上。
解决方案
方案1:修改资源加载代码(推荐)
直接从类路径根目录查找资源,有两种写法:
- 使用带斜杠的绝对路径:
var resource = this.getClass().getResource("/sample.properties"); - 使用类加载器直接查找(默认从根目录开始):
var resource = this.getClass().getClassLoader().getResource("sample.properties");
方案2:调整资源文件的存放位置
把sample.properties放到和类同包的resources子目录下,比如你的类在mypackage中,就创建src/main/resources/mypackage目录,把资源文件放进去。Gradle构建时会自动将这个资源复制到build/resources/main/mypackage,和类文件所在的包路径对应,此时原有的相对路径加载代码就能正常工作。
方案3:调整Gradle配置合并类和资源输出目录(不推荐)
如果一定要保持现有资源位置和加载代码,可以在build.gradle中添加配置,让Gradle把资源文件复制到类输出目录:
tasks.withType(JavaCompile) { options.outputDirectory = file("$buildDir/classes/java/main") } processResources { destinationDirectory = file("$buildDir/classes/java/main") }
不过这种方式违背了Gradle的标准构建结构,可能引发其他类路径相关问题,不建议长期使用。
内容的提问来源于stack exchange,提问作者wafl22
相关产品推荐
相关产品推荐

