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

使用maven-assembly-plugin生成的Jar无法运行,报NullPointerException求助

解决maven-assembly-plugin打包Jar运行时NullPointerException问题

我来帮你排查这个问题——这种IDEA中运行正常、打包成Jar后抛出NPE的场景,大概率是资源文件的读取方式出了问题,结合你的异常栈和配置,给你梳理下原因和解决方案:

问题定位

从异常信息Exception in thread "main" java.lang.NullPointerException at App.<init>(App.java:26)来看,空指针出现在App类的构造方法第26行。结合IDEA运行正常的现象,基本可以确定是Jar包内资源文件的读取逻辑错误:

  • 在IDEA中运行时,项目的src/main/resources资源是直接暴露在文件系统中的,用File类或者基于文件路径的读取方式能正常工作;
  • 但打包成Jar后,资源是嵌入在Jar包内部的二进制文件,此时再用文件路径去读取就会找不到资源,返回null,进而触发空指针。

配置合理性检查

你的maven-assembly-plugin配置是正常的:jar-with-dependencies描述符会把项目class、资源和所有依赖打包到一个Jar里,主类也正确指定了,所以配置本身不是问题。

解决方案:修改资源读取方式

把原来基于文件路径的读取逻辑,改成类加载器的流读取方式,这样无论在IDEA还是Jar包中都能正常读取资源。

举个例子,如果你的第26行是类似这样的错误代码:

// 错误:用File读取Jar内资源会返回null
File configFile = new File("src/main/resources/config.properties");
FileInputStream fis = new FileInputStream(configFile);

改成下面的正确写法:

// 正确:用类加载器获取资源流
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("config.properties");
// 如果是静态方法,用类名直接获取类加载器
// InputStream inputStream = App.class.getClassLoader().getResourceAsStream("config.properties");

// 然后用Properties或其他流工具处理
Properties props = new Properties();
try {
    props.load(inputStream);
    // 处理你的配置内容
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 记得关闭流
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

额外验证步骤

  1. 打开你生成的Jar包,检查根目录下是否存在你要读取的资源文件(比如config.properties),确认Maven已经把资源正确打包进去;
  2. 如果资源没被打包,检查pom.xml是否有自定义的资源配置,确保src/main/resources目录没有被排除。

内容的提问来源于stack exchange,提问作者user8404636

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:07:32