1. 程式人生 > >【Java基礎】Jar包結構結構分析和操作詳解

【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 一般屬性

  1. Manifest-Version
    用來定義manifest檔案的版本,例如:Manifest-Version: 1.0
  2. Created-By
    宣告該檔案的生成者,一般該屬性是由jar命令列工具生成的,例如:Created-By: Apache Ant 1.5.1
  3. Signature-Version
    定義jar檔案的簽名版本
  4. Class-Path
    應用程式或者類裝載器使用該值來構建內部的類搜尋路徑

1.2.2 應用程式相關屬性

  1. Main-Class
    定義jar檔案的入口類,該類必須是一個可執行的類,一旦定義了該屬性即可通過 java -jar x.jar來執行該jar檔案。

1.2.3 小程式(Applet)相關屬性

  1. Extendsion-List
    該屬性指定了小程式需要的擴充套件資訊列表,列表中的每個名字對應以下的屬性
  2. -Extension-Name
  3. -Specification-Version
  4. -Implementation-Version
  5. -Implementation-Vendor-Id
  6. -Implementation-URL

1.2.4 擴充套件標識屬性

  1. Extension-Name
    該屬性定義了jar檔案的標識,例如Extension-Name: Struts Framework。

1.2.5 包擴充套件屬性

  1. Implementation-Title 定義了擴充套件實現的標題
  2. Implementation-Version 定義擴充套件實現的版本
  3. Implementation-Vendor 定義擴充套件實現的組織
  4. Implementation-Vendor-Id 定義擴充套件實現的組織的標識
  5. Implementation-URL : 定義該擴充套件包的下載地址(URL)
  6. Specification-Title 定義擴充套件規範的標題
  7. Specification-Version 定義擴充套件規範的版本
  8. Specification-Vendor 聲明瞭維護該規範的組織
  9. 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