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

Java JAR 打包全攻略:從原理到命令行實戰

     編輯:Java 相關知識

什麼是 JAR?

JAR (Java Archive) 是 Java 平台的標準封裝格式,本質上是一個 ZIP 壓縮文件。它的核心作用是將零散的 .class 文件、配置文件、圖片、JSP/HTML 等資源整合為單一文件,便於分發、部署和類加載。

JAR 技術自 JDK 1.1 起引入,1.2 版本增強。官方總結的優勢包括:安全性、快速下載、壓縮存儲、包密封、版本控制、跨平台可移植性。

核心輸入與輸出

  • 輸入(待打包內容):編譯生成的 .class 文件 + 輔助資源(圖片、配置、JSP、HTML 等)。
  • 輸出(產物):單一的 .jar 文件,內含清單文件 META-INF/MANIFEST.MF。
  • 後續流程:發布/部署到伺服器、Maven 倉庫或分發給用戶。

jar 命令詳解

打開命令行(Windows 執行 cmd),輸入 jar --help 或 jar 查看用法:

用法: jar {ctxui}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...

核心操作參數(互斥,必選其一)

參數含義
-c創建新的存檔
-t列出存檔目錄
-x解壓存檔(指定或所有文件)
-u更新現有存檔

常用修飾參數

參數含義
-v生成詳細輸出到標準輸出
-f必選,指定 JAR 文件名
-m包含指定清單文件的清單信息
-0僅存儲,不壓縮(無 ZIP 壓縮)
-M不生成所有條目的清單文件
-i為指定 JAR 生成索引信息
-C切換到指定目錄並包含後續文件(支持目錄遞歸)

實戰範例

1. 創建可執行 JAR(含 Main-Class)

# 1. 編寫清單文件 Manifest.txt
Main-Class: com.example.MainApp

# 2. 打包
jar -cvfm MyApp.jar Manifest.txt -C build/classes .
  • -c 創建,-v 顯示過程,-f 指定文件名,-m 引入清單。
  • -C build/classes . 切換到編譯輸出目錄,打包所有內容。

2. 查看 JAR 內容

jar -tf MyApp.jar

3. 解壓 JAR

jar -xf MyApp.jar          # 解壓全部
jar -xf MyApp.jar com/example/Config.properties  # 解壓指定文件

4. 更新 JAR(如替換配置文件)

jar -uvf MyApp.jar com/example/new-config.properties

清單文件關鍵屬性

Manifest-Version: 1.0
Main-Class: com.example.MainApp          # 入口類,雙擊/ java -jar 運行
Class-Path: lib/dependency1.jar lib/...  # 依賴路徑(相對路徑,空格分隔)
Sealed: true                             # 密封包,防止擴展

避坑指南

  • 參數順序:-m 和 -f 指定的文件須與命令中出現順序一致。
  • 路徑問題:善用 -C 避免將絕對路徑打入包內。
  • 編碼:清單文件建議用 UTF-8 保存,避免中文亂碼。
  • 大文件:超大資源考慮外置,Class-Path 引用,而非打入 JAR 膨脹體積。

現代構建工具集成

實際項目中極少手動敲 jar 命令,主流構建工具已封裝:

  • Maven:maven-jar-plugin / maven-shade-plugin(打 Fat JAR)
  • Gradle:jar { manifest { attributes 'Main-Class': '...' } }
  • Spring Boot:spring-boot-maven-plugin 一鍵生成可執行 Fat JAR,內嵌容器。

總結

掌握 jar 命令底層原理,有助於理解構建產物結構、排查類加載衝突、定制打包邏輯。從「壓縮分發」到「模組化封裝」(JDK 9+ JMOD/Jlink),JAR 始終是 Java 生態的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved