1. 程式人生 > >java中的manifest檔案格式

java中的manifest檔案格式

在打jar包時,我們有時需要對manifest檔案進行描述,在這裡記錄manifest相關的格式,以供日後參考。

manifest基本格式:

manifest 檔案的格式 是很簡單的,每一行都是 名-值 對應的:屬性名開頭,接著是 ":" ,然後是屬性值,每行最多72個字元,如果需要增加,你可以在下一行續行,續行以空格開頭,以空格開頭的行都會被視為前一行的續行,所有在開頭的屬性都是全域性的。

有main函式的jar包的manifest的格式:

       Manifest-Version:1.0
       Created-By:1.5.08 (Sun   Microsystems   Inc.)

       Main-Class: com.pantosoft.impdb.ImpMain

       Manifest-Version表示使用1.0的manifest檔案

       Created-By表示使用了的sun的1.5.08的jar生成

       Main-Class表示有主函式的類

基於其他jar並有main函式的manifest的格式:

       Manifest-Version:1.0
       Created-By:1.5.08 (Sun   Microsystems   Inc.)

       Main-Class: com.pantosoft.impdb.ImpMain

       Class-Path:mail.jar activation.jar

       Class-Path表示基於其他的2個jar包,並且以空格隔開表示有個jar包。如有路徑,側表示如下:

       Class-Path:ext/mail.jar ext/activation.jar

基於其他jar並有多個main函式的manifest的格式:

還有一種Multiple Main Classes情況,如果你的應用程式可能有命令列版本和GUI版本,或者一些不同的應用共享很多相同的程式碼,這時你可能有多個Main Class,我們建議你採取這樣的策略:把共享的類打成lib包,然後把不同的應用打成不  同的包,分別標誌主類:如下

       Manifest for impDB.jar :

       Manifest-Version:1.0
       Created-By:1.5.08 (Sun   Microsystems   Inc.)

       Class-Path:mail.jar activation.jar

       Manifest for impDB.jar :

       Manifest-Version:1.0
       Created-By:1.5.08 (Sun   Microsystems   Inc.)

       Class-Path:impDB.jar

       Main-Class: com.pantosoft.impdb.ImpMain

       Manifest for ExpDB.jar :

       Manifest-Version:1.0
       Created-By:1.5.08 (Sun   Microsystems   Inc.)

       Class-Path:expDB.jar

       Main-Class: com.pantosoft.impdb.ExpMain

        impDB.jar 和  ExpDB.jar 的manifest檔案中分別註明各自的 Main Class

Package Versioning:

完成釋出後,如果使用者想了解 ,哪些程式碼是誰的?目前是什麼版本?使用什麼版本的類庫?解決的方法很多,manifest提供了一個較好的方法,你可以在manifest檔案中描述每一個包的資訊。Java 秉承了實現說明與描述分離的原則,package 的描述 定義了package 是什麼,實現說明定義了誰提供了描述的實現,描述和實現包含名、版本號和提供者。要得到這些資訊,可以檢視JVM的系統屬性(使用 java.lang.System.getProperty() )在manifest檔案中,我可以為每個package定義描述和實現版本,宣告名字,並加入描述屬性和實現屬性,這些屬性是:

Specification-Title
Specification-Version
Specification-Vendor
Implementation-Title
Implementation-Version
Implementation-Vendor

當要提供一個類庫或程式設計介面時,描述資訊顯得是很重要,見以下範例:

Manifest-Version:1.0
Created-By:1.5.08 (Sun   Microsystems   Inc.)
Class-Path: mail.jar activation.jar

Name: com/example/myapp/
Specification-Title: MyApp
Specification-Version: 2.4
Specification-Vendor: example.com
Implementation-Title: com.example.myapp
Implementation-Version: 2002-03-05-A
Implementation-Vendor: example.com

Package Version 查詢:

在manifest檔案中加入package描述後,就可以使用Java提供的java.lang.Package class進行Package 的資訊查詢,這裡列舉3個最基本的獲取package object的方法:

1.Package.getPackages():返回系統中所有定義的package列表
2.Package.getPackage(String packagename):按名返回package
3.Class.getPackage():返回給定class所在的package

使用這方法就可以動態的獲取package資訊. 需要注意的是如果給定的package中沒有class被載入,則也無法獲得package 物件

Manifest 技巧:

  1. 總是以Manifest-Version屬性開頭
  2. 每行最長72個字元,如果超過的化,採用續行
  3. 確認每行都以回車結束,否則改行將會被忽略
  4. 如果Class-Path 中的存在路徑,使用"/"分隔目錄,與平臺無關
  5. 使用空行分隔主屬性和package屬性
  6. 使用"/"而不是"."來分隔package 和class ,比如 com/example/myapp/
  7. class 要以.class結尾,package 要以 / 結尾