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