Maven项目无法读取resources资源,触发NullPointerException
问题描述
项目结构

尝试的读取代码
想要读取src/main/resources下的pws.csv,使用了以下代码:
BufferedReader br = new BufferedReader(new InputStreamReader(App.class.getClass().getResourceAsStream("pws.csv")));
错误现象
无论是在IntelliJ中直接运行,还是打包成jar后运行,均抛出NullPointerException(表明文件未找到)。尝试过/pws.csv、src/main/resources/pws.csv等路径变体,问题依旧。已知Maven中src/main/resources是默认资源目录,IntelliJ应该自动识别,疑惑是否需要修改配置或操作有误。
补充信息
jar包文件列表

运行jar时的堆栈跟踪
Exception in thread "main" java.lang.NullPointerException at java.base/java.io.Reader.<init>(Reader.java:167) at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:72) at com.kolan.Main.main(Main.java:8)
解决方案
1. 修正类加载器的使用方式
你当前使用App.class.getClass()获取的是根类加载器,无法正确加载应用类路径下的资源。改用以下两种正确写法:
// 方式1:使用当前类的类加载器,路径相对于类路径根 BufferedReader br = new BufferedReader(new InputStreamReader(App.class.getClassLoader().getResourceAsStream("pws.csv"))); // 方式2:使用当前类的getResourceAsStream,加/表示从类路径根查找 BufferedReader br = new BufferedReader(new InputStreamReader(App.class.getResourceAsStream("/pws.csv")));
2. 确认Maven资源打包配置
检查pom.xml中是否正确配置了资源目录,确保src/main/resources下的文件会被打包到jar根目录:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource> </resources> </build>
同时对照jar文件列表,确认pws.csv确实存在于jar的根目录中。
3. IntelliJ资源目录标记检查
在IntelliJ中,确保src/main/resources被正确标记为资源根目录:
- 右键
src/main/resources→ 选择「Mark Directory as」→「Resources Root」 - 重新编译项目后再运行测试。
4. 路径规则说明
- 类加载器方式(
ClassLoader.getResourceAsStream):路径直接写资源名,不需要开头的/,相对于类路径根查找。 - 当前类方式(
Class.getResourceAsStream):如果要从类路径根查找,必须加开头的/;不加/则是相对于当前类所在的包路径查找。
内容的提问来源于stack exchange,提问作者Connor Kolan
相关产品推荐
相关产品推荐

