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

JAR 檔案格式深度解析:從基礎到進階應用

     編輯:J2ME

什麼是 JAR 檔案?

JAR (Java Archive) 檔案格式基於流行的 ZIP 格式,用於將多個檔案打包成單一檔案。不同於一般壓縮檔,JAR 不僅用於壓縮與發布,更支援函式庫、元件與外掛程式的組織與封裝,可被編譯器、JVM 等工具直接使用。JAR 內包含特殊檔案(如 Manifest、簽名檔),指示工具如何處理特定 JAR。

JAR 的主要用途

  • 類別函式庫的發布與使用
  • 應用程式與擴充功能的建構單元
  • 元件、Applet 或外掛程式的部署單位
  • 打包與元件相關的輔助資源(圖片、設定檔等)

JAR 格式優勢

  • 安全性:可加密數位簽章,工具可選擇授予安全權限,並偵測程式碼是否被竄改。
  • 減少下載時間:Applet 打包成 JAR 後,瀏覽器可在單一 HTTP 連線下載所有類別檔與資源。
  • 壓縮:提升儲存效率。
  • 平台擴充:Java Extensions Framework 透過 JAR 封裝擴充功能(如 Java 3D、JavaMail)。
  • 套件密封:強制同一套件的所有類別必須在同一 JAR 中,增強版本一致性與安全性。
  • 套件版本控制:JAR 可內嵌廠商、版本等資訊。
  • 可攜性:處理 JAR 的機制屬 Java 平台核心 API 標準部分。

壓縮與非壓縮 JAR

預設 jar 工具會壓縮檔案。非壓縮 JAR 載入較快(無需解壓),但網路傳輸時間較長。

META-INF 目錄

大多數 JAR 包含 META-INF 目錄,儲存套件與擴充的設定資料(安全性、版本資訊)。Java 2 平台辨識以下檔案:

  • MANIFEST.MF:定義擴充與套件相關資料
  • INDEX.LIST:jar -i 產生,包含應用程式/擴充中定義套件的位置資訊,供類別載入器加速載入
  • *.SF:JAR 簽名檔
  • *.DSA:簽名區塊檔,儲存簽名 JAR 所用的公開金鑰

jar 工具常用指令

功能指令
用單一檔案建立 JARjar cf jar-file input-file...
用目錄建立 JARjar cf jar-file dir-name
建立非壓縮 JARjar cf0 jar-file dir-name
更新 JARjar uf jar-file input-file...
檢視 JAR 內容jar tf jar-file
解壓 JAR 所有內容jar xf jar-file
解壓特定檔案jar xf jar-file archived-file...
執行可執行 JARjava -jar app.jar

可執行 JAR

可執行 JAR 是自包含的 Java 應用程式,經特殊設定後可直接由 JVM 執行,無需先解壓或設定類別路徑。

建立步驟

  1. 將所有應用程式碼放入一個目錄
  2. 建立 manifest 檔案,加入一行:Main-Class: com.mycompany.myapp.Sample
  3. 執行:jar cmf manifest ExecutableJar.jar application-dir
  4. 即可用 java -jar ExecutableJar.jar 執行

可執行 JAR 的 Manifest 必須透過 Class-Path 標頭引用所有相依 JAR。使用 -jar 選項時,環境變數 CLASSPATH 與命令列指定的類別路徑會被 JVM 忽略。

套件密封

在 Manifest 中為套件加入 Name 標頭(以 / 結尾)與 Sealed: true,即可密封該套件。若嘗試從該 JAR 以外載入密封套件中的類別,JVM 會拋出 SecurityException。

擴充功能打包

擴充功能透過 Manifest 的 Class-Path 標頭指定所需的其他 JAR。JVM 載入使用擴充機制的 JAR 時,會自動將 Class-Path 引用的 JAR 加入類別路徑(路徑為相對路徑,通常需置於同一目錄)。

JAR 安全性與數位簽章

JAR 可用 jarsigner 工具或 java.security API 簽名。簽名後 Manifest 會更新,META-INF 新增簽名檔 (.SF) 與簽名區塊檔 (.DSA/.RSA)。

Keystore 與金鑰管理

私鑰與公開金鑰憑證存於受密碼保護的 Keystore 資料庫中,每個項目由唯一別名存取。使用 keytool -genkey 產生金鑰對並加入 Keystore。

jarsigner 簽名與驗證

# 簽名
jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass \
          -keypass jamespass -signedjar SSample.jar Sample.jar james

# 驗證
jarsigner -verify SSample.jar

JAR 索引

JDK 1.3+ 支援 JAR 索引優化網路應用程式/Applet 的類別搜尋。jar -i 建立 INDEX.LIST,儲存於根 JAR 的 META-INF 中,類別載入器下載第一個 JAR 後即可高效定位所需類別所在的 JAR,避免線性搜尋造成的頻寬浪費與啟動延遲。

結語

JAR 格式遠超單純壓縮格式,其內建於核心平台(編譯器、類別載入器)的豐富功能,能顯著提升 Java 應用程式的效率、安全性與組織性。善用 JAR 特性,可簡化開發與部署流程。

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