JAR檔案可以可選地在META-INF
目錄中包含名為MANIFEST.MF
的Manifest
檔案。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
檔案中有兩種型別的部分:主部分和各個部分。
空行必須分隔任何兩個部分。主部分中的條目適用於整個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-Version
和Created-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
檔案名的順序必須與選項m
和f
的順序匹配。
例如,可以通過以不同的順序指定f
和m
選項來更改上述命令,如下所示:
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
以下命令將使用選項u
將com.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/ https://www.tw511.com/tutorial.jar
上面的條目有三個CLASSPATH
專案:一個JAR
檔案Main.jar
,一個使用檔案協定檔案的目錄:c:/book/
和另一個使用HTTP協定的JAR檔案https://www.tw511.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檔案中封裝包,請包括兩個屬性:Name
和Sealed
。 Name
屬性的值是包的名稱,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