上一篇
使用Maven执行
mvn package或Gradle运行
jar任务自动打包;在IDEA/Eclipse中通过导出功能生成可执行JAR;手动使用
jar cvfe命令指定主类并包含编译后的class文件。
核心打包方法
使用JDK自带命令(适合简单项目)
# 编译所有.java文件 javac -d ./out src/*.java # 打包编译后的class文件 jar cvf myapp.jar -C out/ . # 指定主类(可执行JAR) jar cvfe myapp.jar com.example.MainClass -C out/ .
说明:
-d:指定编译输出目录cvf:创建(c)、显示详情(v)、指定文件名(f)e:指定入口主类(MANIFEST.MF中自动添加Main-Class)
使用Maven(标准项目管理)
步骤:
- 在
pom.xml中添加打包配置:<build> <plugins> <!-- 基础打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.example.Main</mainClass> <!-- 指定主类 --> </manifest> </archive> </configuration> </plugin> </plugins> </build> - 执行打包命令:
mvn clean package # 输出在target目录
生成Fat Jar(包含依赖):

<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>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
使用Gradle(灵活构建)
基础配置(build.gradle):
plugins {
id 'java'
}
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
}
执行打包:

gradle jar # 输出在build/libs
生成Fat Jar:
plugins {
id 'com.github.johnrengelman.shadow' version '8.1.1' // 添加Shadow插件
}
apply plugin: 'com.github.johnrengelman.shadow'
shadowJar {
archiveBaseName = 'myapp'
archiveClassifier = 'all'
mergeServiceFiles()
}
运行:

gradle shadowJar
关键注意事项
- MANIFEST.MF文件:
- 必须包含
Main-Class头声明可执行JAR - 格式要求:
Main-Class: com.example.Main(末尾换行符!)
- 必须包含
- 依赖处理:
- Fat Jar:适用于简单应用(Maven Assembly/Gradle Shadow)
- 避免依赖冲突:使用
maven-shade-plugin的relocate重命名包
- 模块化项目(Java 9+):
- 添加
module-info.java - 使用
jlink或jpackage生成自定义运行时
- 添加
验证JAR是否可用
# 检查文件结构 jar tf myapp.jar # 运行可执行JAR java -jar myapp.jar # 排查类加载问题 java -verbose:class -jar myapp.jar | grep "Loaded"
常见问题解决
- “no main manifest attribute”:
缺失Main-Class声明,检查MANIFEST.MF或构建配置。 - ClassNotFoundException:
依赖未正确打包(Fat Jar配置错误)。 - 版本冲突:
使用mvn dependency:tree分析依赖树。 - 签名问题:
删除签名文件:zip -d myapp.jar 'META-INF/*.SF' 'META-INF/*.RSA'
最佳实践建议
- 分离依赖:生产环境推荐将依赖库放入
/lib目录,通过Class-Path引用:Class-Path: lib/dependency1.jar lib/dependency2.jar
- 版本管理:JAR文件名包含版本号(如
myapp-1.0.0.jar)。 - 安全扫描:使用OWASP Dependency-Check扫描依赖破绽。
- 持续集成:在Jenkins/GitHub Actions中自动化打包流程。
引用说明参考Oracle官方文档JAR文件规范、Maven官方指南及Gradle用户手册,并基于Java 17 LTS版本验证,构建工具版本号截至2025年10月有效,建议定期检查更新。
