JAR(Java ARchive)基於 ZIP 格式,服務於兩大核心場景:
java -jar 或雙擊啟動。JRE/lib/ext/(舊版)或模組路徑/類路徑,供其他程式復用。Manifest-Version: 1.0
Main-Class: A
Created-By: 1.8.0_XXX (Oracle Corporation)
格式鐵律:冒號後恰好一個空格,每行以換行符結尾。
jar cfm Tom.jar Mymoon.mf A.class B.class
c create、f file、m manifestMain-Class 尋找入口java -jar Tom.jar
# 或雙擊(需關聯 javaw.exe)
WinRAR 關聯搶占問題:安裝解壓軟體後 .jar 被關聯為壓縮包,導致雙擊無法執行。
解決方案:編寫啟動腳本 Tom.bat:
@echo off
javaw -jar Tom.jar
發布時附帶 .bat/.sh 腳本,用戶點擊腳本即可穩定啟動。
// Test1.java
public class Test1 {
public void fTest1() { System.out.println("I am a method In Test1 class"); }
}
// Test2.java
public class Test2 {
public void fTest2() { System.out.println("I am a method In Test2 class"); }
}
Manifest-Version: 1.0
Class: Test1 Test2
Created-By: 1.8.0_XXX (Oracle Corporation)
Class 屬性聲明導出類,非強制但利於文檔化與工具索引。
jar cfm Jerry.jar moon.mf Test1.class Test2.class
copy Jerry.jar %JAVA_HOME%\jre\lib\ext\
部署後,同一 JRE 下所有程式均可直接 new Test1() 使用,無需配置類路徑。
jre/lib/ext 機制,改用模組系統(JPMS)與 --module-path。module-info.java),避免全域擴展目錄污染。| 操作 | 命令 | 說明 |
|---|---|---|
| 創建 | jar cf jar-file input-files | 基本打包 |
| 帶 Manifest | jar cfm jar-file manifest-file input-files | 可執行 JAR |
| 更新 | jar uf jar-file input-files | 增量更新 |
| 查看目錄 | jar tf jar-file | 列出所有條目 |
| 解壓 | jar xf jar-file [files] | 解壓全部或指定文件 |
| 查看 Manifest | jar xf jar-file META-INF/MANIFEST.MF | 提取清單文件 |
| 簽名 | jarsigner -keystore ks.jar myapp.jar alias | 數位簽名驗證完整性 |
| 驗證簽名 | jarsigner -verify myapp.jar | 校驗簽名有效性 |
| 屬性 | 用途 | 範例 |
|---|---|---|
| Manifest-Version | 清單版本(固定 1.0) | 1.0 |
| Main-Class | 應用入口主類 | com.app.Main |
| Class-Path | 相對路徑依賴列表(空格分隔) | lib/a.jar lib/b.jar |
| Created-By | 生成工具/版本 | Maven 3.8 / JDK 17 |
| Sealed | 密封包(防止類被擴展) | true/false |
| Implementation-Version | 實現版本號 | 1.2.3 |
| Specification-Version | 規範版本號 | 2.0 |
JAR 是 Java 生態的基礎分發單元。理解 Main-Class 啟動機制、Class-Path 依賴聲明、ext 目錄擴展機制(及其在模組化時代的替代方案),能讓你從容應對從桌面工具到企業級類庫的各種打包部署場景。現代專案請優先採用構建工具自動化管理,避免手動維護 Manifest 產生的低級錯誤。