getClass().getResource()加载jar包内资源失败的路径问题求解
getResource()资源加载失败修复方案
核心认知偏差
你预期查找路径为build/resources本身是错误的:
标准Gradle/Maven项目编译阶段,
src/main/resources下的所有文件会被自动复制到类路径根目录:
- 开发未打包阶段:类路径根为
build/classes/java/main(Gradle)或target/classes(Maven)- 打包成jar后运行阶段:类路径根为jar包内部的根目录
getClass().getResource()本身的查找逻辑没有问题,你遇到的报错100%是路径写法错误导致。
常见路径写法错误
- 错误1:带源码目录前缀,比如写
getClass().getResource("src/main/resources/xxx.png"),编译后不存在src目录,必然找不到 - 错误2:使用相对路径未加前缀斜杠:如果你的调用类位于
com.xxx.xxx包下,不带斜杠的写法getClass().getResource("xxx.png")会去类路径下的com/xxx/xxx/目录查找资源,而不是类路径根目录 - 错误3:大小写不匹配:jar包内路径大小写敏感,本地开发Windows环境大小写不敏感没报错,打包到Linux或读取jar内部路径时就会加载失败
正确写法示例
- 如果你把图片放在
src/main/resources/icon.png,要从类路径根查找,写法为:getClass().getResource("/icon.png") - 也可以用类加载器查找,默认从类路径根出发,不需要加斜杠:
getClass().getClassLoader().getResource("icon.png") - 如果资源放在子目录,比如
src/main/resources/assets/login.png,对应写法为:getClass().getResource("/assets/login.png")
快速排查步骤
- 开发阶段先打开
build/classes/java/main目录,确认你的资源文件已经被复制到对应路径,没有被build配置过滤 - 打包后直接解压jar包,查看资源在jar内的实际路径,直接匹配该路径写查找规则即可
内容的提问来源于stack exchange,提问作者ExceptionalException
相关产品推荐
相关产品推荐

