可执行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
相关产品推荐
相关产品推荐

