【Java基礎】Jar包結構結構分析和操作詳解
一 JAR包結構分析
JAR(Java Archive FIle)Java歸檔檔案,是Java標準的文件格式,是一個或多個Java位元組碼檔案的打包壓縮檔案,採用常見的ZIP壓縮演算法,和ZIP檔案十分類似,可以直接解壓。
JAR檔案主要用來壓縮和釋出位元組碼檔案,而且還用於部署和封裝庫、元件和外掛程式,並且可以被像編輯器和JVM這樣的工具直接使用。
1.1 JAR包結構
JAR包的結構如下圖所示:
1.2 MANIFEST.MF屬性
從上圖可以看出,JAR包比普通zip檔案多了一個META-INF資料夾,該資料夾下包含了一個MANFEST.MF檔案。
1.2.1 一般屬性
- Manifest-Version
用來定義manifest檔案的版本,例如:Manifest-Version: 1.0 - Created-By
宣告該檔案的生成者,一般該屬性是由jar命令列工具生成的,例如:Created-By: Apache Ant 1.5.1 - Signature-Version
定義jar檔案的簽名版本 - Class-Path
應用程式或者類裝載器使用該值來構建內部的類搜尋路徑
1.2.2 應用程式相關屬性
- Main-Class
定義jar檔案的入口類,該類必須是一個可執行的類,一旦定義了該屬性即可通過 java -jar x.jar來執行該jar檔案。
1.2.3 小程式(Applet)相關屬性
- Extendsion-List
該屬性指定了小程式需要的擴充套件資訊列表,列表中的每個名字對應以下的屬性 - -Extension-Name
- -Specification-Version
- -Implementation-Version
- -Implementation-Vendor-Id
- -Implementation-URL
1.2.4 擴充套件標識屬性
- Extension-Name
該屬性定義了jar檔案的標識,例如Extension-Name: Struts Framework。
1.2.5 包擴充套件屬性
- Implementation-Title 定義了擴充套件實現的標題
- Implementation-Version 定義擴充套件實現的版本
- Implementation-Vendor 定義擴充套件實現的組織
- Implementation-Vendor-Id 定義擴充套件實現的組織的標識
- Implementation-URL : 定義該擴充套件包的下載地址(URL)
- Specification-Title 定義擴充套件規範的標題
- Specification-Version 定義擴充套件規範的版本
- Specification-Vendor 聲明瞭維護該規範的組織
- Sealed 定義jar檔案是否封存,值可以是true或者false
1.2.6 簽名相關屬性
簽名方面的屬性我們可以來參照JavaMail所提供的mail.jar中的一段:
Name: javax/mail/Address.class
Digest-Algorithms: SHA MD5
SHA-Digest: AjR7RqnN//cdYGouxbd06mSVfI4=
MD5-Digest: ZnTIQ2aQAtSNIOWXI1pQpw==
這段內容定義類簽名的類名、計算摘要的演算法名以及對應的摘要內容(使用BASE64方法進行編碼)。
1.2.7 自定義屬性
除了前面提到的一些屬性外,你也可以在MANIFEST.MF中增加自己的屬性以及響應的值,例如J2ME程式jar包中就可能包含著如下資訊
MicroEdition-Configuration: CLDC-1.0
MIDlet-Name: J2ME_MOBBER Midlet Suite
MIDlet-Info-URL: http://www.javayou.com/
MIDlet-Icon: /icon.png
MIDlet-Vendor: Midlet Suite Vendor
MIDlet-1: mobber,/icon.png,mobber
MIDlet-Version: 1.0.0
MicroEdition-Profile: MIDP-1.0
MIDlet-Description: Communicator
我們如何讀取這些資訊呢?
JDK給我們提供了用於處理這些資訊的API,我們可以通過給JarFile傳遞一個jar檔案的路徑,然後呼叫JarFile的getManifest方法來獲取Manifest資訊。
二 JAR包操作詳解
2.1 JAR操作命令
JAR相關操作命令如下圖所示:
如果使用引數f,就需要指定JAR檔案;如果使用引數m,就需要指定manife檔案;如果使用引數e,就需要指定main入口類,這些引數的指定順序也應該和程式或入口點的指定順序保持一致。
另外如果使用引數m,則會生成預設的清單檔案,如果使用引數m,則會使用指定的檔案作為清單檔案,如果使用引數M,則表示不生成任何清單檔案。
針對以上命令,下面做一些詳細的解釋:
- -c 建立新的JAR檔案包。
- -t 列出JAR檔案包的內容列表。
- -x 展開JAR檔案包的指定檔案或所有檔案。
- -u 更新已存在的JAR包,對於一個已經存在的JAR包,我們任然可以向其中新增新的位元組碼檔案或舊的位元組碼檔案,如果已經存在路徑、類名都相同的檔案,則更新原始檔,如果不存在,則新增該檔案。清單檔案也可以通過這種方式更改。
- -v 生成詳細的報告並列印到標準輸出。
- -f 指定JAR包的檔名,通常該選項是必選的。
- -m 指定需要包含的MANIFEST.MF清單檔案。
- -O 只儲存,不壓縮。生成的JAR包體積大,但執行速度快。
- -M 不產生所有項的清單檔案,此引數會忽略-m選項。
- [-C 目錄] 表示轉到指定目錄下去執行jar命令的操作,它相當於優先使用cd命令轉到指定目錄下執行不帶-C引數的jar命令,它只能在建立和更新JAR包的時候使用。
下面舉一些具體使用的例子:
jar tvf allenwells.jar
顯示allenwells.jar內包含檔案的詳細資訊。
jar -xvf allenwells.jar
解壓allenwells.jar到當前目錄,並顯示詳細的解壓過程資訊。
jar cvf allenwells.jar com
將com目錄下的class檔案生成allenwells.jar檔案,並顯示打包過程,如果已經存在該檔案,那麼該檔案會被覆蓋。
jar cvfm allenwells.jar mymanifest.mf -C com/ .
使用自定義的清單檔案mymanifest.mf並將com/目錄下的所有檔案歸檔到allenwells.jar中,allenwells.jar被儲存到當前目錄。
jar uvf allenwells.jar manifest.mf
向allenwells.jar中新增manifest.mf檔案,這裡只是作為普通檔案新增進去。如果指定了-m選項,那麼manifest.mf會作為清單檔案來使用,其內容會被新增到MANIFEST.MF中。
製作可執行Jar包
在Windoows下安裝JRE的時候,安裝檔案會把.jar檔案對映給javaw.exr開啟,對於一個可執行的JAR包而言,可以直接雙擊開啟。下面說明一下具體操作流程:
編寫MANIFEST-MF檔案
MANIFEST-MF檔案檔案內容如下所示:
Manifest-Version:1.0
Created-By:1.8.0_31 (Oracle Corporation)
Main-Class:com.allenwells.MainStart
可以看出,想要製作可執行JAR包,指定Main-Class是關鍵。
使用cvmf命令進行打包
jar -cvmf MANIFEST.MF allenwells.jar com