Java项目引用的依赖库中res文件夹下配置文件无法读取怎么解决?
Java依赖库内部资源文件读取失败排查解决流程
第一步:确认资源文件是否被正确打入依赖JAR包
- 找到作为依赖导入的Java项目打包生成的jar文件,用解压工具直接打开,查看jar根目录下是否存在
browserstack.parallel.conf.json文件 - 如果文件不存在,说明依赖项目的构建配置未将res目录纳入资源打包范围,根据你使用的构建工具修改配置:
Maven配置(添加到pom.xml的build节点下):
<build> <resources> <resource> <directory>src/res</directory> <includes> <include>**/*.json</include> </includes> </resource> </resources> </build>Gradle配置(添加到build.gradle中):
配置完成后重新打包依赖项目,再重新导入到主项目中。sourceSets { main { resources { srcDir 'src/res' } } }
第二步:修正资源读取逻辑
jar包内部的资源属于压缩包内的条目,无法通过本地File类直接访问,你之前的两种写法本身存在逻辑问题:
- 第一种写法问题:
getResource()返回的是jar包内的资源URL,格式为jar:file:/xxx/xxx.jar!/browserstack.parallel.conf.json,直接调用getFile()拿到的路径不是本地文件系统的有效路径,new File必然找不到 - 第二种写法问题:相对路径是相对于主项目的运行工作目录,不会访问到依赖项目的src目录,且依赖项目打包后src目录不会出现在主项目运行环境中
正确的读取方式为直接通过类加载器获取资源输入流读取内容,示例代码:
// 非静态方法中使用 try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("browserstack.parallel.conf.json")) { // 静态方法中使用把getClass()替换为当前类名.class即可 if (inputStream == null) { throw new RuntimeException("找不到配置文件:browserstack.parallel.conf.json"); } // 此处将inputStream转换为JSON对象或字符串即可使用 } catch (IOException e) { e.printStackTrace(); }
第三步:校验运行时类路径配置
如果修改读取逻辑后还是返回null,按以下方式排查:
- 执行
mvn dependency:tree(Maven项目)或gradle dependencies(Gradle项目)确认依赖包已正常引入主项目 - 如果是直接运行主项目jar包,执行
jar tf 主项目jar包名称.jar确认依赖jar包是否在类加载路径内 - 确认依赖项目的res目录属于main源码集,而非test源码集,test下的资源不会被打包到正式jar包中
内容的提问来源于stack exchange,提问作者abhishek narayan
相关产品推荐
相关产品推荐

