✅ 什么是 JAR
✅ 命令用法详解
✅ 常用场景和例子
🚀 【1️⃣ 什么是 JAR 文件】
-
JAR = Java ARchive
-
本质上就是一个 .zip 文件
-
用来打包:
-
.class文件 -
配置、资源文件
-
META-INF/MANIFEST.MF(清单文件)
-
✅ 主要用途:
-
共享库(依赖)
-
可执行应用
-
分发 Java 插件
🚀 【2️⃣ JAR 命令结构】
Java 自带的 jar 工具用法是:
jar {ctxu}[vfm0MeiP] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
✅ 重点选项:
| 选项 | 作用 |
|---|---|
| -c | 创建新 JAR |
| -t | 列出内容 |
| -x | 解压 |
| -u | 更新已有 JAR |
| -v | 详细输出 |
| -f | 指定 JAR 文件名 |
| -m | 使用指定的清单文件 MANIFEST.MF |
| -e | 指定可执行 JAR 的入口类(Main-Class) |
| -0 | 仅存储(不压缩) |
| -M | 不自动生成清单文件 |
| -i | 为 JAR 生成索引(Class-Path 优化) |
| -P | 保留绝对路径/父目录成分 |
| -C | 进入目录再打包 |
🚀 【3️⃣ 最常用命令详解+例子】
✅ 3.1 创建 Jar
jar cf app.jar *
-
c= create -
f= specify file -
把当前目录下所有文件打进 app.jar
jar cvf app.jar *
-
v= verbose,打印详细输出
✅ 3.2 列出内容
查看 jar
jar tf app.jar
输出类似:
META-INF/MANIFEST.MF com/example/App.class com/example/Util.class
✅ 3.3 解压 Jar
把所有文件解出来
jar xf app.jar
✅ 解到当前目录
也可以指定某个文件:
jar xf app.jar com/example/App.class
✅ 3.4 更新 Jar
往已有 jar 里追加或替换文件
jar uf app.jar NewClass.class
✅ 很适合「补丁」
✅ 3.5 创建带清单文件
如果有自己写的 MANIFEST.MF:
Manifest-Version: 1.0 Main-Class: com.example.Main
打包命令:
jar cfm app.jar MANIFEST.MF *
-
m= manifest file
✅ 生成的 jar 会带这个 MANIFEST。
✅ 3.6 创建可执行 Jar
最常用的生产用法:
jar cfe myapp.jar com.example.Main -C build/classes .
解释:
-
c= create -
f= file name -
e= entry point(Main-Class) -
-C build/classes .= 进入 build/classes 目录打包里面的所有文件
✅ 自动生成的 META-INF/MANIFEST.MF 会有
Main-Class: com.example.Main
✅ 运行方式:
java -jar myapp.jar
✅ 3.7 不压缩
存储但不 zip 压缩
jar cf0 app.jar *
-
0= store only
✅ 用在某些场景(比如解包更快)。
✅ 3.8 生成索引
大型 jar 的 Class-Path 优化
jar i app.jar
会在 jar 里生成:
META-INF/INDEX.LIST
✅ 3.9 指定目录打包(-C)
jar cf app.jar -C build/classes .
解释:
-
进入 build/classes
-
把里面的所有文件打包
-
不会带 build/classes 这个前缀路径
🚀 【4️⃣ MANIFEST.MF详解】
每个 JAR 里的 META-INF/MANIFEST.MF 会记录信息,比如:
Manifest-Version: 1.0 Main-Class: com.example.Main Class-Path: lib/other.jar
✅ 作用
-
声明可执行 jar 的主类
-
指定依赖路径
-
版本元信息
🚀 【5️⃣ 解包 / 修改 / 重打包**
⚡️ 5.1 解包
mkdir tmp
cd tmp
jar xf ../app.jar
⚡️ 5.2 替换内容
cp ../MyFixedClass.class com/example/
⚡️ 5.3 重打包
保留原 MANIFEST
jar cfm ../app-patched.jar META-INF/MANIFEST.MF *
✅ 这样就「替换」了 JAR 里原来的类。
🚀 【6️⃣ 结合 unzip 命令】
因为 JAR = ZIP,本质上任何 unzip 工具都能用:
✅ 查看
unzip -l app.jar
✅ 解压
unzip app.jar -d out/
✅ 修改后重新压
zip -r app-patched.jar *
🚀 【7️⃣ 常见场景总结】
✅ 查看里面有什么
jar tf mylib.jar
✅ 解开
jar xf mylib.jar
✅ 更新
jar uf mylib.jar NewClass.class
✅ 自己写主类
jar cfe app.jar com.example.Main -C build/classes .
✅ 指定外部 manifest
jar cfm app.jar MyManifest.mf -C build/classes .
✅ 合并多个 jar
-
解包所有
-
合并目录
-
去重
-
重新打包
✅ 生产构建
-
Maven Shade Plugin
-
Gradle Shadow Plugin
✅ 【重点总结】
JAR = ZIP 包含 .class 和 MANIFEST.MF,用 jar 命令或 unzip 都能操作。
-
查看 →
jar tf -
解压 →
jar xf -
创建 →
jar cf -
更新 →
jar uf -
指定入口类 →
jar cfe -
用外部清单 →
jar cfm -
进入目录 →
-C
3万+

被折叠的 条评论
为什么被折叠?



