mvn package
或gradle build
命令自动打包,若用IDE,右键项目选择Export或Build Artifacts生成可执行JAR,需指定主类入口。核心概念
- JAR文件本质
Java ARchive(JAR)是压缩格式的Java类文件、资源文件和元数据(如MANIFEST.MF
)的集合,类似ZIP文件。 - 可执行JAR要求
MANIFEST.MF
文件中必须指定主类:Main-Class: com.example.Main
打包方法详解
方法1:使用IDE(推荐初学者)
IntelliJ IDEA步骤:
- 打开项目 → 顶部菜单选 File > Project Structure
- 左侧 Artifacts → 点 → JAR > From modules with dependencies
- 选择主类(Main Class)→ 设置输出目录(Output directory)
- 点击 Apply → 返回编辑器,顶部菜单 Build > Build Artifacts
- 选择 Build → 生成的JAR在项目目录的
out/artifacts/
下
Eclipse步骤:
- 右键项目 → Export → 搜索 Runnable JAR file
- 选择启动配置(Launch configuration)和主类
- 设置输出路径 → 选择依赖处理方式:
- Extract required libraries:解压依赖到JAR内(适合简单项目)
- Package required libraries:依赖JAR放入同级
libs
文件夹
- 点击 Finish
方法2:使用Maven(自动化构建)
- 配置
pom.xml
添加maven-jar-plugin
和主类声明:<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>
- 生成可执行JAR
终端执行:mvn clean package
- 输出位置
生成的JAR在target/
目录,命名为项目名-版本.jar
处理依赖(生成含依赖的Fat JAR)
使用maven-assembly-plugin
:
<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>
执行mvn package
后,target/
目录生成项目名-版本-jar-with-dependencies.jar
方法3:使用Gradle
- 配置
build.gradle
启用application
插件并指定主类:plugins { id 'application' } application { mainClass = 'com.example.Main' // 替换为你的主类 }
- 生成标准JAR
执行:gradle jar
JAR输出在
build/libs/
生成Fat JAR
添加shadow
插件(推荐):
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' }
执行:
gradle shadowJar
输出文件为build/libs/项目名-all.jar
方法4:手动打包(理解原理)
- 编译所有Java文件
javac -d ./out src/**/*.java
- 创建
MANIFEST.MF
在out/
目录新建MANIFEST.MF
Manifest-Version: 1.0 Main-Class: com.example.Main # 替换主类 Class-Path: libs/dependency1.jar libs/dependency2.jar # 若有依赖
- 打包JAR
jar cvfm app.jar ./out/MANIFEST.MF -C ./out .
c
创建新JARv
输出详细信息f
指定文件名m
包含清单文件
运行与验证
- 启动命令
java -jar your-app.jar
- 依赖处理
若依赖在外部libs/
目录,需保持MANIFEST.MF
中Class-Path
路径一致。
常见问题解决
- “no main manifest attribute”
原因:未指定主类。
修复:检查MANIFEST.MF
的Main-Class
路径是否正确,或重新配置构建工具。 - ClassNotFoundException
原因:依赖未包含。
修复:- 使用Fat JAR打包(推荐)
- 或将依赖JAR放入
Class-Path
指定目录
- 编码问题
编译时指定编码:javac -encoding UTF-8 ...
最佳实践
- 自动化构建:优先用Maven/Gradle,减少手动错误
- 版本管理:在JAR名中包含版本号(如
app-1.0.0.jar
) - 依赖隔离:生产环境推荐使用Docker容器化部署
- 安全扫描:使用
OWASP Dependency-Check
扫描依赖漏洞
引用说明基于Oracle官方JAR文档、Apache Maven指南、Gradle手册及IDE官方文档综合整理,确保方法经过实践验证,具体命令参数可参考:
- Oracle JAR工具:https://docs.oracle.com/javase/tutorial/deployment/jar/
- Maven JAR插件:https://maven.apache.org/plugins/maven-jar-plugin/
- Gradle Shadow插件:https://github.com/johnrengelman/shadow
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/41323.html