大多數 Java 程序員都熟悉對 JAR 文件的基本操作
但是只有少數程序員了解 JAR 文件格式的強大功能
在本文中
作者探討了 JAR 格式的許多功能和優勢
包括打包
可執行的 JAR 文件
安全性和索引
JAR 文件是什麼? JAR 文件格式以流行的 ZIP 文件格式為基礎
用於將許多個文件聚集為一個文件
與 ZIP 文件不同的是
JAR 文件不僅用於壓縮和發布
而且還用於部署和封裝庫
組件和插件程序
並可被像編譯器和 JVM 這樣的工具直接使用
在 JAR 中包含特殊的文件
如 manifests 和部署描述符
用來指示工具如何處理特定的 JAR
一個 JAR 文件可以用於
用於發布和使用類庫
作為應用程序和擴展的構建單元
作為組件
applet 或者插件程序的部署單位
用於打包與組件相關聯的輔助資源
JAR 文件格式提供了許多優勢和功能
其中很多是傳統的壓縮格式如 ZIP 或者 TAR 所沒有提供的
它們包括
安全性
可以對 JAR 文件內容加上數字化簽名
這樣
能夠識別簽名的工具就可以有選擇地為您授予軟件安全特權
這是其他文件做不到的
它還可以檢測代碼是否被篡改過
減少下載時間
如果一個 applet 捆綁到一個 JAR 文件中
那麼浏覽器就可以在一個 HTTP 事務中下載這個 applet 的類文件和相關的資源
而不是對每一個文件打開一個新連接
壓縮
JAR 格式允許您壓縮文件以提高存儲效率
傳輸平台擴展
Java 擴展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法
這些擴展是用 JAR 文件打包的(Java
D 和 JavaMail 就是由 Sun 開發的擴展例子)
包密封
存儲在 JAR 文件中的包可以選擇進行密封
以增強版本一致性和安全性
密封一個包意味著包中的所有類都必須在同一 JAR 文件中找到
包版本控制
一個 JAR 文件可以包含有關它所包含的文件的數據
如廠商和版本信息
可移植性
處理 JAR 文件的機制是 Java 平台核心 API 的標准部分
壓縮的和未壓縮的 JAR jar 工具(有關細節參閱 jar 工具)在默認情況下壓縮文件
未壓縮的 JAR 文件一般可以比壓縮過的 JAR 文件更快地裝載
因為在裝載過程中要解壓縮文件
但是未壓縮的文件在網絡上的下載時間可能更長
METAINF 目錄 大多數 JAR 文件包含一個 META
INF 目錄
它用於存儲包和擴展的配置數據
如安全性和版本信息
Java
平台識別並解釋 META
INF 目錄中的下述文件和目錄
以便配置應用程序
擴展和類裝載器
MANIFEST
MF
這個 manifest 文件定義了與擴展和包相關的數據
INDEX
LIST
這個文件由 jar 工具的新選項
i 生成
它包含在應用程序或者擴展中定義的包的位置信息
它是 JarIndex 實現的一部分
並由類裝載器用於加速類裝載過程
xxx
SF
這是 JAR 文件的簽名文件
占位符 xxx 標識了簽名者
xxx
DSA
與簽名文件相關聯的簽名程序塊文件
它存儲了用於簽名 JAR 文件的公共簽名
jar 工具 為了用 JAR 文件執行基本的任務
要使用作為Java Development Kit 的一部分提供的 Java Archive Tool (jar 工具)
用 jar 命令調用 jar 工具
表
顯示了一些常見的應用
表
常見的 jar 工具用法 功能 命令
用一個單獨的文件創建一個 JAR 文件 jar cf jar
file input
file
用一個目錄創建一個 JAR 文件 jar cf jar
file dir
name
創建一個未壓縮的 JAR 文件 jar cf
jar
file dir
name
更新一個 JAR 文件 jar uf jar
file input
file
查看一個 JAR 文件的內容 jar tf jar
file
提取一個 JAR 文件的內容 jar xf jar
file
從一個 JAR 文件中提取特定的文件 jar xf jar
file archived
file
運行一個打包為可執行 JAR 文件的應用程序 java
jar app
jar
可執行的 JAR 一個可執行的 jar 文件是一個自包含的 Java 應用程序
它存儲在特別配置的JAR 文件中
可以由 JVM 直接執行它而無需事先提取文件或者設置類路徑
要運行存儲在非可執行的 JAR 中的應用程序
必須將它加入到您的類路徑中
並用名字調用應用程序的主類
但是使用可執行的 JAR 文件
我們可以不用提取它或者知道主要入口點就可以運行一個應用程序
可執行 JAR 有助於方便發布和執行 Java 應用程序
創建可執行 JAR 創建一個可執行 JAR 很容易
首先將所有應用程序代碼放到一個目錄中
假設應用程序中的主類是 com
mycompany
myapp
Sample
您要創建一個包含應用程序代碼的 JAR 文件並標識出主類
為此
在某個位置(不是在應用程序目錄中)創建一個名為 manifest 的文件
並在其中加入以下一行
Main
Class: com
mycompany
myapp
Sample
然後
像這樣創建 JAR 文件
jar cmf manifest ExecutableJar
jar application
dir
所要做的就是這些了
現在可以用 java
jar 執行這個 JAR 文件 ExecutableJar
jar
一個可執行的 JAR 必須通過 menifest 文件的頭引用它所需要的所有其他從屬 JAR
如果使用了
jar 選項
那麼環境變量 CLASSPATH 和在命令行中指定的所有類路徑都被 JVM 所忽略
啟動可執行 JAR 既然我們已經將自己的應用程序打包到了一個名為 ExecutableJar
jar 的可執行 JAR 中了
那麼我們就可以用下面的命令直接從文件啟動這個應用程序
java
jar ExecutableJar
jar
包密封 密封 JAR 文件中的一個包意味著在這個包中定義的所有類都必須在同一個 JAR 文件中找到
這使包的作者可以增強打包類之間的版本一致性
密封還提供了防止代碼篡改的手段
要密封包
需要在 JAR 的 manifest 文件中為包添加一個 Name 頭
然後加上值為
true
的 Sealed 頭
與可執行的 JAR 一樣
可以在創建 JAR 時
通過指定一個具有適當頭元素的 manifest 文件密封一個 JAR
如下所示
Name: com/samplePackage/
Sealed: true
Name 頭標識出包的相對路徑名
它以一個
/
結束以與文件名區別
在 Name 頭後面第一個空行之前的所有頭都作用於在 Name 頭中指定的文件或者包
在上述例子中
因為 Sealed 頭出現在 Name 頭後並且中間沒有空行
所以 Sealed 頭將被解釋為只應用到包 com/samplePackage 上
如果試圖從密封包所在的 JAR 文件以外的其他地方裝載密封包中的一個類
那麼 JVM 將拋出一個 SecurityException
擴展打包 擴展為 Java 平台增加了功能
在 JAR 文件格式中已經加入了擴展機制
擴展機制使得 JAR 文件可以通過 manifest 文件中的 Class
Path 頭指定所需要的其他 JAR 文件
假設 extension
jar 和 extension
jar 是同一個目錄中的兩個 JAR 文件
extension
jar 的 manifest 文件包含以下頭
Class
Path: extension
jar
這個頭表明 extension
jar 中的類是 extension
jar 中的類的擴展類
extension
jar 中的類可以調用 extension
jar 中的類
並且不要求 extension
jar 處在類路徑中
在裝載使用擴展機制的 JAR 時
JVM 會高效而自動地將在Class
Path 頭中引用的 JAR 添加到類路徑中
不過
擴展 JAR 路徑被解釋為相對路徑
所以一般來說
擴展 JAR 必須存儲在引用它的 JAR 所在的同一目錄中
例如
假設類 ExtensionClient 引用了類 ExtensionDemo
它捆綁在一個名為 ExtensionClient
jar 的 JAR 文件中
而類 ExtensionDemo 則捆綁在 ExtensionDemo
jar 中
為了使 ExtensionDemo
jar 可以成為擴展
必須將 ExtensionDemo
jar 列在 ExtensionClient
jar 的 manifest 的 Class
Path 頭中
如下所示
Manifest
Version:
Class
Path: ExtensionDemo
jar
在這個 manifest 中 Class
Path 頭的值是沒有指定路徑的 ExtensionDemo
jar
表明 ExtensionDemo
jar 與 ExtensionClient JAR 文件處在同一目錄中
JAR 文件中的安全性 JAR 文件可以用 jarsigner 工具或者直接通過 java
security API 簽名
一個簽名的 JAR 文件與原來的 JAR 文件完全相同
只是更新了它的 manifest
並在 META
INF 目錄中增加了兩個文件
一個簽名文件和一個簽名塊文件
JAR 文件是用一個存儲在 Keystore 數據庫中的證書簽名的
存儲在 keystore 中的證書有密碼保護
必須向 jarsigner 工具提供這個密碼才能對 JAR 文件簽名
圖
Keystore 數據庫
JAR 的每一位簽名者都由在 JAR 文件的 META
INF 目錄中的一個具有
SF 擴展名的簽名文件表示
這個文件的格式類似於 manifest 文件
一組 RFC
頭
如下所示
它的組成包括一個主要部分
它包括了由簽名者提供的信息
但是不特別針對任何特定的 JAR 文件項
還有一系列的單獨的項
這些項也必須包含在 menifest 文件中
在驗證一個簽名的 JAR 時
將簽名文件的摘要值與對 JAR 文件中的相應項計算的摘要值進行比較
清單
簽名 JAR 中的 Manifest 和 signature 文件
Contents of s
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19206.html