JAR (Java ARchive) 本質是 ZIP 格式壓縮檔,內含編譯後的 .class、資源檔與 META-INF/MANIFEST.MF 清單檔。由 JDK/bin/jar.exe 建立,執行時依賴 lib/tools.jar。
jar {c|t|x|u} [v] [f] [m] [e] [0] [M] [i] [-C dir] files...
| 參數 | 功能 | 備註 |
|---|---|---|
c | 建立新 JAR | 四大核心操作互斥,必選其一 |
t | 列出目錄 | — |
x | 解壓縮 | — |
u | 更新現有 JAR | — |
f | 指定 JAR 檔名 | 幾乎必加,否則輸出到 stdout |
v | 詳細輸出 | 顯示壓縮率、大小 |
m | 指定自訂 MANIFEST | 配合 manifest 檔 |
e | 指定主類別 (Main-Class) | 建立可執行 JAR,Java 6+ |
0 | 不壓縮 (存儲模式) | 加快打包速度,檔案較大 |
M | 不產生 MANIFEST | 忽略 -m 設定 |
i | 產生索引檔 (INDEX.LIST) | 加速類別載入,大型 JAR 有用 |
-C dir | 切換工作目錄 | 相當於 cd dir 後執行 |
jar cvf myapp.jar -C build/classes .
將 build/classes 目錄下所有內容打包,-C 避免把目錄名也包進去。
jar tvf myapp.jar
jar xvf myapp.jar
jar uvf myapp.jar com/example/NewClass.class
jar cvf0 resources.jar *.png *.wav
jar cvfm myapp.jar manifest.txt -C build/classes .
jar cfe myapp.jar com.example.Main -C build/classes .
等同於在 Manifest 寫入 Main-Class: com.example.Main。
jar i myapp.jar
會在 META-INF/INDEX.LIST 寫入包/類別索引,類別載入器可先查索引再決定開啟哪個 JAR。
Main-Class: com.example.Main。常用屬性:
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
Created-By: 1.8.0_202 (Oracle Corporation)
manifest.txt(含 Main-Class、Class-Path)。jar cvfm app.jar manifest.txt -C out/production/classes .java -jar app.jar 或雙擊(檔案關聯正確時)。JRE/lib/ext/:放入 JAR,由 ExtensionClassLoader 載入,優先於應用程式類別路徑。Class-Path:相對路徑,支援多個 JAR,空格分隔。URL url = new URL("jar:https://example.com/app.jar!/");
JarURLConnection juc = (JarURLConnection) url.openConnection();
Attributes attr = juc.getMainAttributes();
String mainClass = attr.getValue("Main-Class");
Class> clazz = Class.forName(mainClass);
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, (Object) new String[0]);
需 JAR 內 Manifest 正確設定 Main-Class。
jar cvfM data.jar folder (不產生 META-INF) → 改名 data.zip。META-INF/MANIFEST.MF。jar tvf big.jar > list.txt 避免終端機閃過。cd 到類別根目錄再執行 jar,或用 -C 參數。