JAR文件可以可選地在META-INF目錄中包含名為MANIFEST.MF的清單文件。
清單文件包含有關(guān)JAR文件及其條目的信息。
清單文件可以包含有關(guān)JAR文件的CLASSPATH設(shè)置及其主條目類的信息。
主條目類是具有啟動獨立應(yīng)用程序的main()方法的類,包的版本信息等。
清單文件被分成由空白行分隔的部分。每個部分包含名稱 - 值對。 一個新行分隔每個名稱/值對。冒號分隔名稱及其對應(yīng)的值。
清單文件必須以新行結(jié)束。以下是樣本清單文件:
Manifest-Version: 1.0 Created-By: 1.8.0_20-ea-b05 (Oracle Corporation) Main-Class: com.w3cschool.Main Profile: compact1
上面的清單文件有一個具有四個屬性的部分:
清單文件中有兩種類型的節(jié):主節(jié)和各個節(jié)。
空行必須分隔任何兩個部分。主節(jié)中的條目適用于整個JAR文件。單個部分中的條目適用于特定條目。
單個節(jié)中的屬性覆蓋主節(jié)中的相同屬性。
單個條目以“Name”屬性開頭,其值是JAR文件中條目的名稱,后面是該條目的其他屬性。
Manifest-Version: 1.0 Created-By: 1.6.0 (Sun Microsystems Inc.) Main-Class: com.w3cschool.Main Sealed: true Name: book/data/ Sealed: false Name: images/logo.bmp Content-Type: image/bmp
上面的清單文件包含三個部分:一個主要部分和兩個單獨部分。
在兩個部分之間有一個空白行。
第一個個別部分指示包裝書/數(shù)據(jù)未被密封。這個單獨的section屬性“Sealed:false”將覆蓋主要部分的屬性“Sealed:true”。
第二個單獨部分用于名為images / logo.bmp的條目。它表示條目的內(nèi)容類型是bmp類型的映像。
jar命令可以創(chuàng)建默認清單文件并將其添加到JAR文件。默認清單文件僅包含兩個屬性:Manifest-Version和Created-By。
您可以使用選項 M
告訴jar工具忽略默認的清單文件。
以下命令將創(chuàng)建一個test.jar文件,而不添加默認清單文件:
jar cMf test.jar *
jar命令為您提供了自定義清單文件內(nèi)容的選項。
選項m指定具有清單文件內(nèi)容的文件。
jar命令將從指定的清單文件讀取名稱/值對,并將其添加到MANIFEST.MF文件。
假設(shè)你有一個名為manifest.txt的文件,其中有一個屬性條目。請確保在文件末尾添加新行。文件內(nèi)容如下:
Main-Class: com.w3cschool.Main
要通過將當前工作目錄中的所有類文件包含在新的test.jar文件中,從manifest.txt文件中添加Main-Class屬性值,請執(zhí)行以下命令:
jar cfm test.jar manifest.txt *.class
指定選項m時,還必須指定清單文件名。您指定新的JAR文件名和清單文件名的順序必須與選項m和f的順序匹配。
例如,您可以通過以不同的順序指定f和m選項來更改上述命令,如下所示:
jar cmf manifest.txt test.jar *.class
此命令將向test.jar文件添加具有以下內(nèi)容的清單文件:
Manifest-Version: 1.0 Created-By: 1.8.0_20-ea (Oracle Corporation) Main-Class: com.w3cschool.Main
如果未在清單文件中指定清單文件和創(chuàng)建者屬性,該工具將添加它們。它默認的清單版本為1.0。創(chuàng)建者默認為您使用的JDK版本。
以下代碼顯示如何使用java命令運行Java程序,并指定具有main()方法的類名,如下所示
java com.w3cschool.Main
com.w3cschool是包名稱。
我們可以使用-jar選項與java命令運行jar文件,如下所示:
java -jar test.jar
當您運行上述命令時,JVM將在test.jar文件中的MANIFEST.MF文件中查找Main-Class屬性的值,并嘗試運行該類。
如果您在test.jar文件中未包含Main-Class屬性,則上述命令將生成錯誤。
我們還可以在清單文件中添加Main-Class屬性值,而無需創(chuàng)建我們自己的清單文件。
在創(chuàng)建/更新jar文件時,使用選項e與jar工具。
以下命令將在test.jar文件中的MANIFEST.MF文件中添加com.w3cschool.Main作為Main-Class的值:
jar cfe test.jar com.w3cschool.Main *.class
以下命令將使用選項u for update將com.w3cschool.Main作為現(xiàn)有test.jar文件中MANIFEST.MF文件中Main-Class的值添加:
jar ufe test.jar com.w3cschool.Main
您可以在其清單文件中為JAR文件設(shè)置CLASSPATH。屬性名稱稱為“類路徑”,您必須在自定義清單文件中指定。它是一個空格分隔的jar文件,zip文件和目錄的列表。清單文件中的Class-Path屬性看起來像
Class-Path: Main.jar file:/c:/book/ //hgci.cn/tutorial.jar
上面的條目有三個CLASSPATH項目:一個JAR文件Main.jar,一個使用文件協(xié)議文件的目錄:/ c:/ book /和另一個使用HTTP協(xié)議的JAR文件//hgci.cn/tutorial.jar。
目錄名稱必須以正斜杠結(jié)尾。假設(shè)此類路徑設(shè)置包含在test.jar文件的清單文件中。當使用以下java命令運行test.jar文件時,此CLASSPATH將用于搜索和加載類。
java -jar test.jar
當使用java命令使用-jar選項運行JAR文件時,將忽略JAR文件(在上述情況下為test.jar文件)的清單文件之外的任何CLASSPATH設(shè)置。
Class-Path屬性的另一個用途是使用jar工具的選項i生成所有包的索引。
以下命令將為test.jar文件中清單文件的Class-Path屬性中列出的所有JAR文件中的所有包生成索引:
jar i test.jar
在JAR文件中封裝包意味著該包中聲明的所有類必須存檔在同一JAR文件中。
要在JAR文件中封裝包,請包括兩個屬性:Name和Sealed。 Name屬性的值是包的名稱,Sealed屬性的值為true。
清單文件中的以下條目將封裝名為com.java2s的包。程序包名稱必須以正斜杠(/)結(jié)尾。
Name: com/w3cschool/ Sealed: true
默認情況下,JAR文件中的所有包都不會被封裝。如果您想要密封JAR文件本身,則可以包含密封歸因,如下所示:
Sealed: true
封裝JAR文件將會封裝該JAR文件中的所有包。但是,您可以通過不單獨密封包裝來覆蓋它。
清單文件中的以下條目將封裝JAR文件中的所有包,除了book/tutorial/package之外:
Sealed: true Name: book/tutorial/ Sealed: false
更多建議: