首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JAR 打包命令詳解:cvfm 參數含義、Manifest 作用與目錄結構控制實戰

     編輯:Java 相關知識

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 三個文件/目錄 |

二、執行效果:JAR 內部結構

假設文件系統結構:


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 文件關鍵屬性


# 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

四、常見變體與避坑

五、現代構建工具對比

| 維度 | jar 命令行 | Maven maven-jar-plugin | Gradle jar task | Spring Boot spring-boot-maven-plugin | |------|----------------------|-----------------------------------|----------------------------|--------------------------------------------------| | 適用場景 | 腳本、教學、極簡項目 | 標準 Java 庫/模塊 | 標準 Java 庫/模塊 | 可執行微服務、Fat JAR | | Manifest 生成 | 手寫 .mf 文件 | <manifest> 配置 | manifest { attributes() } | 自動推導 Main-Class、依賴展開 | | 依賴打包 | 不支援 (需手動 -C lib) | 不支援 (需 assembly/shade) | 不支援 (需 shadow) | **自動解壓依賴到 BOOT-INF/lib** | | 推薦度 | ⭐⭐ (學習/臨時) | ⭐⭐⭐⭐ (庫項目) | ⭐⭐⭐⭐ (庫項目) | ⭐⭐⭐⭐⭐ (Spring Boot 應用) |

六、實戰檢查清單

  1. jar tf your.jar | grep MANIFEST 確認清單存在
  2. java -cp your.jar com.example.Main 手動指定主類測試類加載
  3. java -jar your.jar 驗證 Main-Class 生效
  4. jar xf your.jar META-INF/MANIFEST.MF && cat META-INF/MANIFEST.MF 核對屬性
  5. 生產環境建議:改用 Maven/Gradle 管理打包,避免手動命令差異導致環境不一致

七、總結

jar cvfm 是 JDK 原生打包的「瑞士軍刀」:c 創建、v 可見、f 命名、m 清單、-C 重定向根目錄。理解其參數組合與 Manifest 機制,是掌握 Java 部署基本功的關鍵。實際項目中,請將打包邏輯固化到構建腳本,而非依賴手動命令,確保構建可復現、可審計、可遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求命令/技巧
不指定 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)
解壓 JARjar xf app.jar (x=extract)
入口類未生效檢查 Manifest 換行符 (需 LF)、Main-Class 全限定名無誤、JAR 內確有該 class 文件
Class-Path 失效依賴 JAR 必須與主 JAR 同目錄或按相對路徑放置;java -cp 會忽略 Manifest Class-Path