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月有效,建议定期检查更新。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/40539.html