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

可执行Jar结构与IntelliJ项目结构不一致导致运行时错误

解决Maven打包可执行Jar与IntelliJ运行效果一致的问题

核心问题拆解

你碰到的两个关键问题:

  • 资源文件SensorData.txt未被打包进Jar,导致运行时无法找到
  • Maven默认打包的Jar不包含依赖类,运行时缺失依赖

另外说明:Jar里没有src.main.java层级是正常行为——Maven打包时会将src/main/java下的类编译后直接放到对应包路径下,不会保留源码目录结构,这不是故障。

分步解决方案

1. 确保资源文件被正确打包

首先确认SensorData.txt放在**src/main/resources**目录下(标准Maven资源目录),如果之前放在src/main/java里,Maven默认不会打包该目录下的非.java文件。

若资源路径正确但仍未打包,检查pom.xml的资源配置,确保未排除目标文件:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*</include> <!-- 确保所有资源文件都被打包 -->
            </includes>
        </resource>
    </resources>
</build>

同时,代码里读取资源文件的方式要改为从类路径读取,不能依赖本地文件系统路径:

// 错误方式(依赖本地路径,打包后失效)
// File file = new File("SensorData.txt");

// 正确方式(从类路径读取)
InputStream inputStream = YourMainClass.class.getClassLoader().getResourceAsStream("SensorData.txt");
// 或者使用URL方式
URL resourceUrl = YourMainClass.class.getResource("/SensorData.txt");

2. 打包包含依赖的可执行Jar

Maven默认package命令生成的Jar仅包含项目自身代码,不包含依赖,需要通过插件打包成可执行胖Jar,推荐两种常用插件:

方式一:使用maven-assembly-plugin

在pom.xml的build/plugins节点下添加配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>paging_mission_control.YourMainClass</mainClass> <!-- 替换为你的主类全路径 -->
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

执行命令:mvn clean package,target目录会生成两个Jar,带-jar-with-dependencies后缀的就是包含所有依赖的可执行Jar。

方式二:使用maven-shade-plugin(适合复杂项目,更灵活)

在pom.xml的build/plugins节点下添加配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>paging_mission_control.YourMainClass</mainClass> <!-- 替换为你的主类全路径 -->
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

执行mvn clean package后,target目录下的主Jar就是包含所有依赖的可执行Jar。

3. 验证打包结果

执行jar -tf target/your-jar-file.jar,应能看到:

  • SensorData.txt在Jar根目录(或对应子目录,取决于你在resources下的存放路径)
  • 所有依赖的类文件(第三方库的包路径)
  • 你的项目类文件(paging_mission_control包下的类)

最后运行Jar测试:java -jar target/your-jar-file.jar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:05:16