Java Jar Manifest

Manifest文件

JAR文件可以可選地在META-INF目錄中包含名爲MANIFEST.MFManifest文件。Manifest文件包含有關JAR文件及其條目的信息。Manifest文件可以包含有關JAR文件的CLASSPATH設置及其主條目類的信息。

主條目類是具有啓動獨立應用程序的main()方法的類,包的版本信息等。

manifest文件被分成由空白行分隔的部分。每個部分包含名稱 - 值對。 一個新行分隔每個名稱/值對。冒號分隔名稱及其對應的值。

清單文件必須以新行結束。以下是樣本清單文件:

Manifest-Version: 1.0
Created-By: 1.8.0_20-ea-b05 (Oracle Corporation) 
Main-Class: com.yiibai.Main
Profile:  compact1

上面的manifest文件有一個具有四個屬性的部分:

  • Manifest-Version
  • Created-By
  • Main-Class
  • Profile

Jar清單文件中的部分

manifest文件中有兩種類型的部分:主部分和各個部分。

空行必須分隔任何兩個部分。主部分中的條目適用於整個JAR文件。單個部分中的條目適用於特定條目。

單個部分中的屬性覆蓋主部分中的相同屬性。單個條目以「Name」屬性開頭,其值是JAR文件中條目的名稱,後面是該條目的其他屬性。

Manifest-Version: 1.0
Created-By: 1.6.0  (Sun  Microsystems Inc.) 
Main-Class: com.yiibai.Main 
Sealed: true

Name: book/data/ 
Sealed: false

Name: images/logo.bmp
Content-Type: image/bmp

上面的清單文件包含三個部分:一個主部分和兩個單獨部分。
在兩個部分之間有一個空白行。

第一個單獨部分指示包裝書/數據未被密封。 這個單獨的section屬性「Sealed:false」將覆蓋主部分的屬性「Sealed:true」。

第二個單獨部分用於名爲images/logo.bmp的條目。它表示條目的內容類型是bmp類型的圖片。

Jar Manifest文件中的值

jar命令可以創建默認 Manifest 文件並將其添加到JAR文件。默認清單文件僅包含兩個屬性:Manifest-VersionCreated-By。可以使用選項M告訴jar工具忽略默認Manifest文件。
以下命令將創建一個test.jar文件,而不添加默認Manifest 文件:

jar cMf test.jar  *

jar命令提供了自定義Manifest文件內容的選項。選項m指定具有Manifest文件內容的文件。

jar命令將從指定Manifest文件讀取名稱/值對,並將其添加到MANIFEST.MF文件。

假設有一個名爲manifest.txt的文件,其中有一個屬性條目。請確保在文件末尾添加新行。 文件內容如下:

Main-Class: com.yiibai.Main

要通過將當前工作目錄中的所有類文件包含在新的test.jar文件中,從manifest.txt文件中添加Main-Class屬性值,請執行以下命令:

jar cfm test.jar manifest.txt *.class

指定選項m時,還必須指定Manifest文件名。指定新JAR文件名和Manifest文件名的順序必須與選項mf的順序匹配。

例如,可以通過以不同的順序指定fm選項來更改上述命令,如下所示:

jar cmf manifest.txt test.jar  *.class

此命令將向test.jar文件添加具有以下內容的manifest文件:

Manifest-Version: 1.0
Created-By: 1.8.0_20-ea (Oracle Corporation) 
Main-Class: com.yiibai.Main

如果未在manifest文件中指定manifest文件和創建者屬性,這工具將會自己添加它們。它默認的manifest版本爲1.0。創建者默認爲使用的JDK版本。

主類

以下代碼顯示如何使用java命令運行Java程序,並指定具有main()方法的類名,如下所示:

java com.yiibai.Main

com.yiibai是包名稱。可以使用-jar選項與java命令運行jar文件,如下所示:

java -jar test.jar

當運行上述命令時,JVM將在test.jar文件中的MANIFEST.MF文件中查找Main-Class屬性的值,並嘗試運行該類。
如果在test.jar文件中未包含Main-Class屬性,則上述命令將生成錯誤。

還可以在manifest文件中添加Main-Class屬性值,而無需創建自己的manifest文件。

在創建/更新jar文件時,使用選項e與jar工具。以下命令將在test.jar文件中的MANIFEST.MF文件中添加com.yiibai.Main作爲Main-Class的值:

jar cfe   test.jar com.yiibai.Main *.class

以下命令將使用選項ucom.yiibai.Main用來更新添加到test.jar文件中MANIFEST.MF文件中Main-Class的值:

jar ufe  test.jar com.yiibai.Main

類路徑

可以在其manifest 文件中爲JAR文件設置CLASSPATH。屬性名稱叫作類路徑,必須在自定義清單文件中指定。 它是一個空格分隔的jar文件,zip文件和目錄的列表。 manifest文件中的Class-Path屬性看起來像 -

Class-Path: Main.jar  file:/c:/book/  http://www.yiibai.com/tutorial.jar

上面的條目有三個CLASSPATH項目:一個JAR文件Main.jar,一個使用文件協議文件的目錄:c:/book/和另一個使用HTTP協議的JAR文件http://www.yiibai.com/tutorial.jar

java -jar test.jar

當使用java命令使用-jar選項運行JAR文件時,將忽略JAR文件(在上述情況爲test.jar文件)的 manifest文件之外的任何CLASSPATH設置。
Class-Path屬性的另一個用途是使用jar工具的選項i生成所有包的索引。

以下命令將爲test.jar文件中清單文件的Class-Path屬性中列出的所有JAR文件中的所有包生成索引:

jar i test.jar

在JAR文件中封裝包

在JAR文件中封裝包意味着該包中聲明的所有類必須存檔在同一個JAR文件中。要在JAR文件中封裝包,請包括兩個屬性:NameSealedName屬性的值是包的名稱,Sealed屬性的值爲true

manifest文件中的以下條目將封裝名爲com.yiibai的包。 程序包名稱必須以正斜槓(/)結尾。

Name: com/yiibai/ Sealed: true

默認情況下,JAR文件中的所有包都不會被封裝。 如果想要密封JAR文件本身,則可以包含Sealed屬性,如下所示:

Sealed: true

封裝JAR文件將會封裝該JAR文件中的所有包。 但是,可以通過不單獨密封包裝來覆蓋它。manifest文件中的以下條目將封裝JAR文件中的所有包,除了book/tutorial/package之外:

Sealed: true

Name: book/tutorial/ 
Sealed: false