鍍金池/ 教程/ Java/ Java Jar Manifest
Java文件屬性
Java FilePermission示例
Java Externalizable實(shí)例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實(shí)例
Java FileReader示例
Java控制臺
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實(shí)例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標(biāo)準(zhǔn)輸入/輸出/錯(cuò)誤流
Java文件內(nèi)容和讀寫
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機(jī)訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實(shí)例
FileDescriptor示例

Java Jar Manifest

Manifest文件

JAR文件可以可選地在META-INF目錄中包含名為MANIFEST.MFManifest文件。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-Version
  • Created-By
  • Main-Class
  • Profile

Jar清單文件中的部分

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 Manifest文件中的值

jar命令可以創(chuàng)建默認(rèn) Manifest 文件并將其添加到JAR文件。默認(rèn)清單文件僅包含兩個(gè)屬性:Manifest-VersionCreated-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)mf的順序匹配。

例如,可以通過以不同的順序指定fm選項(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)ucom.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文件中封裝包

在JAR文件中封裝包意味著該包中聲明的所有類必須存檔在同一個(gè)JAR文件中。要在JAR文件中封裝包,請包括兩個(gè)屬性:NameSealedName屬性的值是包的名稱,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