Java测试类读取resources目录文件时getResource返回null问题求解
问题解决思路
根因说明
getResource()返回null的核心原因是运行测试时的classpath根路径下找不到testfile.json文件,常见触发场景如下:
- 构建工具未将
src/main/resources下的资源文件复制到构建输出目录 - 测试运行时的classpath未包含main代码路径的输出目录
- 文件名大小写拼写不匹配(大小写敏感系统下会触发)
解决方案
按优先级逐一排查即可:
- 第一步:验证资源文件是否已同步到构建输出目录
- Maven项目查看
target/classes目录下是否存在testfile.json - Gradle项目查看
build/resources/main目录下是否存在testfile.json
若不存在,执行一次构建命令同步资源:
Maven执行:mvn clean compile
Gradle执行:gradle clean compileJava
- Maven项目查看
- 第二步:检查构建配置是否排除了资源文件
打开Maven的pom.xml或者Gradle的build.gradle,确认没有配置规则排除json类型的资源文件,如下方错误配置需要删除:<!-- 错误的Maven资源排除配置,会导致json文件不被打包 --> <build> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>*.json</exclude> </excludes> </resource> </resources> </build> - 第三步:确认测试classpath包含main资源输出目录
若使用IDEA等IDE,打开项目结构(Project Structure)-> Modules -> 找到myProjectModule -> Dependencies标签页,确认main代码的编译输出目录已加入依赖,Scope设置为Test或Compile。 - 临时验证方案:将testfile.json复制一份到
src/test/resources目录下,重新构建后运行代码,若可以正常读取则说明是main资源未被加载到测试classpath的问题。
代码优化建议
原有代码需要将资源转成File读取,打包成jar包后会无法访问jar内部的资源文件,建议直接用输入流读取,适配所有运行场景:
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("testfile.json")) { if (inputStream == null) { throw new IllegalArgumentException("classpath中未找到testfile.json,请检查资源配置"); } final JsonNode root = mapper.readValue(inputStream, JsonNode.class); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者alchems
相关产品推荐
相关产品推荐

