You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包文件列表

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:42:56