官方文檔html
1. 簡述
JAR表明Java ARchive。它是基於流行的ZIP文件格式的文件格式,用於將許多文件聚合爲一個。儘管JAR能夠用做通用歸檔工具,但其開發的主要動機是Java applet及其必需組件(.class文件,圖像和聲音)能夠在單個HTTP事務中下載到瀏覽器,而不是打開每件做品的新鏈接。這大大提升了applet加載到網頁上並開始運行的速度。JAR格式還支持壓縮,這能夠減少文件的大小並進一步縮短下載時間。此外,小程序做者能夠對JAR文件中的各個條目進行數字簽名,以驗證其來源。java
2. 特色
- 惟一的跨平臺歸檔格式
- 處理音頻和圖像文件以及類文件的惟一格式
- 向後兼容現有的applet代碼
- 開放標準,徹底可擴展,用java編寫
- 捆綁java applet的首選方法
3. META-INF目錄
- MANIFEST.MF: 清單文件,用於定義擴展和包相關的數據。
- INDEX.LIST: 此文件由jar工具的新「 -i」選項生成,該選項包含應用程序或擴展中定義的包的位置信息。它是JarIndex實現的一部分,並由類加載器用於加速其類加載過程。
- x.SF: JAR文件的簽名文件。'x'表明基本文件名。
- x.DSA: 與簽名文件關聯的簽名塊文件具備相同的基本文件名。該文件存儲相應簽名文件的數字簽名。
- services/ : 此目錄存儲全部服務提供程序配置文件。
4. MANIFEST.MF
Manifest-Version: 1.0
Implementation-Title: web
Implementation-Version: 0.0.1
Built-By: catalpaflat
Start-Class: cn.catalpaflat.Application
Implementation-Vendor-Id: cn.catalpaflat
Spring-Boot-Version: 1.3.3.RELEASE
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_161
Implementation-URL: https://platform.spring.io/platform/javaee-catalpaflat/web/
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
複製代碼
在上面的規範中,能夠出如今主要部分中的屬性被稱爲主要屬性,而能夠出如今各個部分中的屬性被稱爲每一個條目屬性。某些屬性能夠出如今主要部分和各個部分中,在這種狀況下,每一個條目屬性值將覆蓋指定條目的主要屬性值。兩種類型的屬性定義以下。web
4.1 Main Attributes
主要屬性是清單主要部分中存在的屬性。他們屬於如下不一樣的羣體:算法
- 通常主要屬性
- Manifest-Version:定義清單文件版本。該值是合法的版本號,如上面的規範中所述。
- Created-By:定義生成此清單文件的java實現的版本和供應商。該屬性由jar工具生成。
- Signature-Version:定義jar文件的簽名版本。該值應爲有效的版本號 字符串。
- Class-Path:此屬性的值指定此應用程序或擴展所需的擴展或庫的相對URL。URL由一個或多個空格分隔。應用程序或擴展類加載器使用此屬性的值來構造其內部搜索路徑。
- 爲獨立應用程序定義的屬性:此屬性由捆綁到可執行jar文件的獨立應用程序使用,可由java運行時直接經過運行「 java -jar x.jar 」 來調用。
- Main-Class:此屬性的值是啓動時啓動程序將加載的主應用程序類的類名。該值不得將.class 擴展名附加到類名。
- 爲擴展標識定義的屬性:擴展使用此屬性來定義其惟一標識。
- Extension-Name:此屬性指定Jar文件中包含的擴展名。名稱應該是惟一標識符,例如包含擴展名的主程序包的名稱。
- 爲擴展和包版本控制 和密封信息定義的屬性:這些屬性定義JAR文件所屬的擴展的功能。這些屬性的值適用於JAR文件中的全部包,但能夠由每一個條目屬性覆蓋。
- Implementation-Title:值是一個字符串,用於定義擴展實現的標題。
- Implementation-Version:該值是一個字符串,用於定義擴展實現的版本。
- Implementation-Vendor:該值是一個字符串,用於定義維護擴展實現的組織。
- Implementation-Vendor-Id:不推薦使用:在未來的版本中可能會忽略此屬性。 該值是一個字符串ID,它惟一地定義維護擴展實現的組織。
- Implementation-URL:不推薦使用:在未來的版本中可能會忽略此屬性。 此屬性定義可從中下載擴展實現的URL。
- Specification-Title:該值是一個字符串,用於定義擴展規範的標題。
- Specification-Version:該值是一個字符串,用於定義擴展規範的版本。
- Specification-Vendor - 供應商:該值是一個字符串,用於定義維護擴展規範的組織。
- Sealed:此屬性定義此JAR文件是否已密封。值能夠是「true」或「false」,忽略大小寫。若是設置爲「true」,則JAR文件中的全部包都默認爲密封,除非它們是單獨定義的。
4.2 Per-Entry Attributes
每一個條目屬性僅適用於與清單條目關聯的單個JAR文件條目。若是主要部分中也出現相同的屬性,則per-entry屬性的值將覆蓋主要屬性的值。例如,若是JAR文件a.jar具備如下清單內容spring
Manifest-Version: 1.0
Created-By: 1.2 (Sun Microsystems Inc.)
Sealed: true
Name: foo/bar/
Sealed: false
複製代碼
這意味着在a.jar中存檔的全部包都是密封的,除了包foo.bar不是。小程序
- 爲文件內容定義的屬性:
- Content-Type:此屬性可用於爲JAR文件中的特定文件條目指定MIME類型和數據子類型。該值應爲type / subtype形式的字符串 。例如,「image / bmp」是具備bmp子類型(表示位圖)的圖像類型。這將指示文件條目做爲圖像,其中數據存儲爲位圖。RFC 1521和1522討論並定義了MIME類型定義。
- 爲包版本控制和密封信息定義的屬性:這些屬性是上面定義的相同屬性集,用於定義擴展包版本控制和密封信息的主要屬性。當用做每一個條目屬性時,這些屬性會覆蓋主要屬性,但僅適用於清單條目指定的單個文件。
- 爲bean對象定義的屬性:
- Java-Bean:定義特定的jar文件條目是不是Java Beans對象。該值應爲「true」或「false」,大小寫將被忽略。
- 爲簽名定義的屬性:這些屬性用於簽名和驗證目的。更多細節在這裏。
- x-Digest-y:此屬性的名稱指定用於計算相應jar文件條目的摘要值的摘要算法的名稱。此屬性的值存儲實際摘要值。前綴「x」指定算法名稱,可選後綴「y」指示應該針對哪一種語言驗證摘要值。
- Magic:這是一個可選屬性,應用程序可使用它來指示驗證程序應如何計算清單條目中包含的摘要值。此屬性的值是一組逗號分隔的上下文特定字符串。詳細說明以下。
4.2.1 Signed JAR File
可使用命令行jarsigner工具或直接經過java.securityAPI 對JAR文件進行簽名。META-INF若是JAR文件由jarsigner工具簽名,則將對每一個文件條目(包括目錄中的非簽名相關文件) 進行簽名。簽名相關文件是:瀏覽器
META-INF/MANIFEST.MF
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
META-INF/SIG-*
複製代碼