jar 是 JDK 自帶的歸檔工具,掌握其核心參數組合,能精準控制 JAR 內部結構、啟動類、版本信息。本文以 jar cvfm classes.jar manifest.mf -C A B1 B2 B3 為例,逐參數拆解,並補充 Manifest 關鍵屬性、多模塊打包、Spring Boot Fat JAR 差異等實戰知識。
jar cvfm classes.jar manifest.mf -C A B1 B2 B3
| 參數 | 全稱 | 作用 | 本例含義 |
|------|------|------|----------|
| c | create | 創建新歸檔文件 | 創建 classes.jar |
| v | verbose | 詳細輸出 | 控制台打印每個加入文件的路徑、大小、壓縮比 |
| f | file | 指定歸檔文件名 | classes.jar (必須緊跟 f) |
| m | manifest | 包含指定 Manifest 文件 | 讀取 manifest.mf 內容寫入 META-INF/MANIFEST.MF |
| -C dir files | change directory | 切換到 dir 目錄再添加 files | 進入 A 目錄,添加 B1 B2 B3 三個文件/目錄 |
假設文件系統結構:
A/
├── B1/
│ └── com/example/Service.class
├── B2/
│ └── resources/config.properties
└── B3/
└── lib/util.jar
執行命令後 classes.jar 內容:
classes.jar
├── META-INF/
│ └── MANIFEST.MF ← 來自 manifest.mf
├── com/
│ └── example/
│ └── Service.class
├── resources/
│ └── config.properties
└── lib/
└── util.jar
關鍵點:-C A 使 A 成為「邏輯根目錄」,JAR 內不再包含 A/ 這一層,直接從 B1/、B2/、B3/ 開始。
# manifest.mf 示例
Manifest-Version: 1.0
Created-By: 1.8.0_202 (Oracle Corporation)
Main-Class: com.example.Application # java -jar 入口類
Class-Path: lib/util.jar lib/other.jar # 運行時類路徑 (相對路徑)
Implementation-Version: 1.2.3
Implementation-Title: MyApp
Sealed: true # 封裝包,防止分散加載
Main-Class:java -jar classes.jar 直接運行的入口Class-Path:相對路徑,支援 lib/ 子目錄,**不支援絕對路徑**Sealed: true:包級封裝,所有包必須來自同一 JAR| 需求 | 命令/技巧 |
|---|---|
| 不指定 Manifest,使用默認 | jar cvf app.jar -C out/ . (點號代表當前目錄所有文件) |
| 只更新現有 JAR 的部分文件 | jar uf app.jar com/example/NewClass.class (u=update) |
| 查看 JAR 內容 | jar tf app.jar (t=list) |
| 解壓 JAR | jar xf app.jar (x=extract) |
| 入口類未生效 | 檢查 Manifest 換行符 (需 LF)、Main-Class 全限定名無誤、JAR 內確有該 class 文件 |
| Class-Path 失效 | 依賴 JAR 必須與主 JAR 同目錄或按相對路徑放置;java -cp 會忽略 Manifest Class-Path |