Java案例如何打包为Jar包?完整实战指南
📖 文章导读
- 什么是Jar包?为什么需要打包?
- 准备工作:环境与项目结构
- 使用命令行手动打包(基础篇)
- 使用Eclipse/IntelliJ IDEA打包(IDE篇)
- 使用Maven/Gradle构建打包(工程篇)
- 常见问题与解决方案(FAQ)
- 打包Jar的最佳实践
什么是Jar包?为什么需要打包?
Q1:Jar包到底是什么?
A:Jar(Java Archive)是Java的归档文件,基于ZIP格式,用于将多个Java类文件、元数据、资源文件(如配置文件、图片)打包成一个文件,你可以把它理解为Java项目的“可执行压缩包”。

Q2:为什么要将Java案例打包成Jar包?
- 部署方便:只需一个文件即可在任意安装JRE的机器上运行。
- 依赖隔离:将项目所有依赖(包括第三方库)打包进Jar,避免环境差异。
- 版本控制:Jar文件名可包含版本号(如
myapp-1.0.jar),便于管理。 - 命令行友好:通过
java -jar myapp.jar即可启动,无需配置classpath。
任何Java程序员在面试或实际工作中,100%会碰到打包Jar的需求。
准备工作:环境与项目结构
1 环境要求
- JDK 8+(推荐JDK 11以上)
- 任意文本编辑器或IDE(本文会涵盖手动与IDE两种方式)
2 示例项目结构
我们以一个简单的“计算器”案例为例,目录如下:
CalculatorApp/
├── src/
│ └── com/
│ └── example/
│ ├── Calculator.java
│ └── Main.java
└── manifest.mf (手动打包时需要)
Main.java 包含public static void main(String[] args)方法,作为程序入口。
3 关键概念:MANIFEST.MF文件
Jar包内部包含一个META-INF/MANIFEST.MF文件,用于指定:
Main-Class:入口类的全限定名Class-Path:依赖路径- 版本信息等
方法一:使用命令行手动打包(基础篇)
适用场景:无IDE、学习底层原理、小型项目。
步骤(Linux / macOS / Windows CMD)
编译所有Java文件
# 进入项目根目录 cd CalculatorApp # 编译src下的所有java文件,输出到out目录 javac -d out src/com/example/*.java
创建MANIFEST.MF文件
在项目根目录创建文件manifest.mf如下:
Manifest-Version: 1.0
Main-Class: com.example.Main
注意:最后必须有一个空行,否则jar命令可能忽略Main-Class。
打包为Jar
jar cfm Calculator.jar manifest.mf -C out .
c:创建新jarf:指定输出文件名m:使用自定义manifest文件-C out .:切换到out目录,将当前目录内容(即class文件)加入jar
运行验证
java -jar Calculator.jar
优缺点
| 优点 | 缺点 |
|---|---|
| 无依赖,仅需JDK | 手动管理依赖繁琐 |
| 理解Jar本质 | 不支持第三方jar自动打包 |
方法二:使用Eclipse/IntelliJ IDEA打包(IDE篇)
适用场景:IDE日常开发、中小型项目管理。
1 IntelliJ IDEA 打包步骤
- 打开项目,点击菜单栏
File→Project Structure(或快捷键Ctrl+Alt+Shift+S)。 - 选择
Artifacts→ →JAR→From modules with dependencies。 - 选择主类(Main Class)。
- 勾选
extract to the target JAR(将依赖解压到Jar中)。 - 确认输出目录后点击
OK。 - 构建:
Build→Build Artifacts→Build。
2 Eclipse 打包步骤
- 右键项目 →
Export→Java→Runnable JAR file。 - 选择启动类和导出路径。
- 选择库处理方式(推荐:
Package required libraries into generated JAR)。 - 点击完成。
Q3:IDE打包和手动打包有何区别?
A:IDE会自动处理依赖、资源文件、MANIFEST.MF,甚至支持打“Fat Jar”(包含所有依赖),手动打包则适合精确控制打包内容。
方法三:使用Maven/Gradle构建打包(工程篇)
适用场景:企业级项目、多模块、依赖管理复杂。
1 Maven打包(最常用)
配置pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 打Fat Jar插件(包含依赖) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行打包命令
mvn clean package
生成文件位于target/目录下,通常有两种:
original-xxx.jar(仅项目类,不含依赖)xxx.jar(含有依赖的Fat Jar)
2 Gradle打包
build.gradle关键配置
plugins {
id 'java'
id 'application'
}
mainClassName = 'com.example.Main'
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
执行命令
gradle clean build
Q4:Fat Jar和普通Jar有什么区别?
A:普通Jar只包含项目自身的class文件,Fat Jar(或Uber Jar)将所有依赖(第三方库)也打包进同一个文件,实现“单文件可运行”,生产环境强烈推荐使用Fat Jar。
常见问题与解决方案(FAQ)
| 问题 | 原因 | 解决 |
|---|---|---|
java -jar 报“No main manifest attribute” |
未指定Main-Class | 检查MANIFEST.MF或IDE配置 |
ClassNotFoundException |
依赖未打包进Jar | 使用Fat Jar或设置Class-Path |
| 中文乱码 | 编译编码问题 | javac -encoding UTF-8 |
| Jar包无法双击运行 | 系统无法识别jar关联(Windows) | 使用java -jar命令 |
| 第三方jar引入失败 (Maven) | 仓库地址错误或依赖名错误 | 检查pom.xml依赖或使用mvn dependency:tree |
Q5:如何查看Jar包内部结构?
A:使用命令jar tf myapp.jar,或直接用解压软件(WinRAR/7-Zip)打开。
打包Jar的最佳实践
- 小型项目/学习:优先使用IntelliJ IDEA的Artifacts功能,高效准确。
- 企业级项目:必须使用Maven或Gradle,配合
maven-shade-plugin或gradle-configuration打Fat Jar。 - 测试场景:手动打包有助于理解Jar本质,但不要用于生产。
- 版本命名:推荐使用
项目名-版本号.jar(如calculator-1.0.jar)。 - 安全注意:不要将数据库密码、密钥硬编码到Jar包中,应使用外部配置文件。
如果你的Java案例需要分享给他人(比如面试演示、开源项目),务必打包为Fat Jar并附带运行说明,掌握几种打包方式,你就能从容应对从个人练习到企业级部署的任何场景。
延伸阅读:
- Oracle官方Jar文件规范
- Maven Shade Plugin 官方文档(可搜索“maven-shade-plugin”获取)
本文由技术实战经验总结而来,所有示例均经过测试,适用于JDK 8~21。