【Java基礎】Jar包結構結構分析和操作具體解釋


作者:郭嘉
郵箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

一 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM