什么是 JAR 文件?
JAR(Java Archive)文件是一种 ZIP 格式的压缩包,专门用于 Java 平台,它主要用于:

- 打包类文件:将编译后的
.class文件、相关的资源文件(如.properties,.xml, 图片等)打包成一个文件,便于分发和管理。 - 创建可执行程序:通过在
META-INF/MANIFEST.MF文件中指定主类,可以使 JAR 文件像可执行文件一样直接运行(java -jar myapp.jar)。 - 作为库:将多个类和资源打包成一个库文件(如
mylib.jar),供其他 Java 项目引用。 - 打包 Java 应用程序:这是最常见的用法,特别是对于桌面应用和微服务。
jar 命令的基本语法
jar 命令的基本语法如下:
jar [options] [jar-file] [manifest] [entry-point] [-C dir] files...
options:命令的选项,-c(创建)、-t(列出内容)、-x(解压) 等。jar-file:要创建或操作的 JAR 文件名。manifest:指定清单文件(MANIFEST.MF)的路径。entry-point:指定应用程序的入口点(主类)。-C dir:在处理文件之前,先切换到指定的目录dir,这对于将特定目录下的文件打包非常有用。files...:要打包到 JAR 文件中的文件或目录列表。
常用选项详解
下面是 jar 命令最核心和最常用的选项:
| 选项 | 长格式 | 描述 |
|---|---|---|
-c |
--create |
创建一个新的 JAR 文件。 |
-t |
--list |
列出 JAR 文件中的内容(目录和文件)。 |
-x |
--extract |
从 JAR 文件中解压指定的文件(或所有文件)。 |
-u |
--update |
更新一个已存在的 JAR 文件(添加或修改文件)。 |
-v |
--verbose |
在标准输出中显示详细的输出信息(正在处理的文件名)。 |
-f |
--file |
指定 JAR 文件的名称。通常与 -c, -u, -x, -t 一起使用。 |
-i |
--index |
为指定的 JAR 文件生成索引文件(META-INF/INDEX.LIST)。 |
-e |
--main-class |
为可执行的 JAR 文件指定主类(入口点)。 |
-m |
--manifest |
包含指定的清单文件(MANIFEST.MF)到 JAR 文件中。 |
-M |
--no-manifest |
在创建 JAR 文件时不自动生成 META-INF/MANIFEST.MF 文件。 |
-C |
切转到指定的目录,并处理接下来的文件。 | |
-0 |
--no-compress |
仅存储文件,不进行压缩(与 ZIP 的 -0 选项相同)。 |
常用命令示例
假设我们有一个简单的 Java 项目结构:
my-project/
├── src/
│ └── com/
│ └── example/
│ └── Main.java
└── lib/
示例 1:创建一个简单的 JAR 文件(仅打包 class 文件)
-
编译代码:
(图片来源网络,侵删)# 在 my-project 目录下执行 javac -d . src/com/example/Main.java
执行后,会生成一个
com/example/Main.class文件。 -
创建 JAR:
# 创建一个名为 app.jar 的文件,并将 com 目录下的所有内容打包进去 jar -cvf app.jar com/
-c: 创建-v: 显示详细信息-f: 指定输出文件名为app.jar
示例 2:创建一个包含资源文件的可执行 JAR 文件
这是最常见的需求,我们需要一个 MANIFEST.MF 文件来指定主类。
-
创建清单文件
manifest.txt: 在my-project目录下创建一个manifest.txt文件,内容如下:
(图片来源网络,侵删)Main-Class: com.example.Main注意:
Main-Class的值是类的全限定名,并且行尾不能有空格,且文件末尾必须有一个空行。 -
编译代码并创建 JAR:
# 假设代码已编译,或者先执行 javac -d . src/com/example/Main.java # 创建可执行 JAR jar -cvfm app.jar manifest.txt com/
-c: 创建-v: 显示详细信息-f: 指定输出文件app.jar-m: 包含manifest.txt文件作为清单
-
运行 JAR 文件:
java -jar app.jar
示例 3:创建一个包含源代码和文档的 JAR 文件(分发库)
有时候我们希望将源代码(.java)和 Javadoc 文档一起打包。
-
生成 Javadoc:
javadoc -d docs src/com/example/Main.java
这会在
my-project下创建一个docs目录。 -
打包源代码和文档:
# 创建一个包含源码、class文件和文档的 JAR jar -cvf mylib-sources.jar com/ docs/
示例 4:查看 JAR 文件内容
# 列出 app.jar 的内容 jar -tf app.jar # 更详细地列出内容(类似于 ls -l) jar -tvf app.jar
示例 5:从 JAR 文件中解压文件
# 解压 app.jar 中的所有文件到当前目录 jar -xvf app.jar # 只解压特定的文件或目录 jar -xvf app.jar com/example/Main.class
示例 6:更新一个 JAR 文件
假设我们修改了 Main.class 文件,并想更新到 app.jar 中。
# 假设 com/example/Main.class 是最新的 jar -uvf app.jar com/
高级用法:模块化 JAR (Java 9+)
从 Java 9 开始,JAR 文件支持模块化(Project Jigsaw),创建模块化 JAR 需要额外的 --module-info 选项。
假设我们有一个 module-info.java 文件:
module com.example.app {
requires java.desktop; // 需要 Java AWT/Swing
exports com.example.app; // 导出这个包
}
创建模块化 JAR:
jar --create --file myapp.jar --main-class com.example.Main --module-info module-info.java -C . .
与构建工具(Maven/Gradle)的关系
虽然 jar 命令非常强大,但在现代 Java 开发中,我们通常不直接使用它,而是使用构建工具来自动化这个过程:
- Maven: 通过
mvn package命令,Maven 会自动编译代码、运行测试、打包(包括处理依赖和生成清单),最终生成target/your-app-1.0-SNAPSHOT.jar。 - Gradle: 通过
gradle build或gradle jar命令,Gradle 也会完成类似的自动化流程,生成build/libs/your-app-1.0.jar。
这些工具简化了构建过程,并处理了依赖管理、插件集成等复杂问题,理解 jar 命令的原理对于排查问题、手动打包或理解构建工具的输出至关重要。
| 任务 | 命令 |
|---|---|
| 创建 JAR | jar -cvf my.jar files_to_add |
| 创建带清单的可执行 JAR | jar -cvfm my.jar manifest.txt files_to_add |
| 列出 JAR 内容 | jar -tf my.jar |
| 解压 JAR | jar -xvf my.jar |
| 更新 JAR | jar -uvf my.jar new_files_to_add |
| 运行可执行 JAR | java -jar my.jar |
掌握 jar 命令是每个 Java 开发者的基本功,它能帮助你深入理解 Java 应用程序的打包和运行机制。
