Java项目如何打jar包?
- 后端开发
- 2025-06-27
- 5
核心打包方法
使用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官方文档Java 17 LTS版本验证,构建工具版本号截至2025年10月有效,建议定期检查更新。