Jar文件及MANIFEST.MF 文件入門

 

前言
     在看Btrace相關源代碼的時,才認識到MANIFEST.MF是有很大用途的,以前對jar文件沒多大瞭解,現在有空也整理下相關的資料。
 
Jar文件簡介    
     Jar文件的本質是zip 文件,其中包含了META-INFO文件夾。Jar文件可以用jar工具或者java.util.jar API 來創建。Jar的文件名沒有任何限制。
     Jar文件不單僅僅用來壓縮class文件或者資源文件,還可以用來限制或者擴展應用程序。如果jar文件中含有META-INFO文件夾,它常常用來存儲包或者配置文件,包括安全、版本、擴展、組件。
     Java2平臺能夠識別並解析META-INFO 文件夾下的下面文件,以便於配置應用程序、擴展和類裝載器: 
MANIEFEST.MF:用來定義擴展和包相關的數據。
INDEX.LIST:這個文件由jar工具的選項 -i 生成的,它包含在應用程序或者擴展中定義的包的位置信息。它是JarIndex實現的一部分,並由類裝載器用於加速類裝載的過程。
x.SF:jar的簽名文件。x表示文件名稱
x.DSA:簽名塊文件,和簽名文件關聯,文件名和簽名文件一樣。該文件主要用於儲存類似數字簽名文件。
services/:儲存所有服務提供者的配置文件。
     配置文件時由鍵值對組成的(name: value),遵循RFC822標準。二進制的數據要求是base64的。如果出現兩個相同的鍵,則最後一個才能被識別。
 
常見的MANIFEST.MF 鍵值對
Manifest-Version: manifest的版本
Created-By: java 實現版本,一般由jar工具生成。
Class-Path : 擴展包的路徑,主要爲絕對路徑或者相對路徑,當指定該參數時,可以不設置classpath也能找到該擴展包
Main-Class : main方法類 
 
安全相關
Sealed : 指定jar是否封閉,如果爲true,則不能jar包中的類不能訪問其他包的類。可以指定特定的包
 
例如:
Manifest-Version: 1.0
Created-By: 1.2 (Sun Microsystems Inc.)
Sealed: true 
Name: foo/bar/
Sealed: false
這樣指的是除了foo.bar包以外的類,都被封閉。
 
agent相關
Premain-Class : 如果 JVM 啓動時指定了代理,那麼此屬性指定代理類,即包含 premain 方法的類。如果 JVM 啓動時指定了代理,那麼此屬性是必需的。如果該屬性不存在,那麼 JVM 將中止。注:此屬性是類名,不是文件名或路徑。 
Agent-Class : 如果實現支持 VM 啓動之後某一時刻啓動代理的機制,那麼此屬性指定代理類。 即包含 agentmain 方法的類。 此屬性是必需的,如果不存在,代理將無法啓動。 注:這是類名,而不是文件名或路徑。 
Boot-Class-Path:  由引導類加載器搜索的路徑列表。路徑表示目錄或庫(在許多平臺上通常作爲 JAR 或 zip 庫被引用)。查找類的特定於平臺的機制失敗後,引導類加載器會搜索這些路徑。按列出的順序搜索路徑。列表中的路徑由一個或多個空格分開。路徑使用分層 URI 的路徑組件語法。如果該路徑以斜槓字符(“/”)開頭,則爲絕對路徑,否則爲相對路徑。相對路徑根據代理 JAR 文件的絕對路徑解析。忽略格式不正確的路徑和不存在的路徑。如果代理是在 VM 啓動之後某一時刻啓動的,則忽略不表示 JAR 文件的路徑。此屬性是可選的。 
Can-Redefine-Classes : 布爾值(true 或 false,與大小寫無關)。是否能重定義此代理所需的類。true 以外的值均被視爲 false。此屬性是可選的,默認值爲 false。 
Can-Retransform-Classes: 布爾值(true 或 false,與大小寫無關)。是否能重轉換此代理所需的類。true 以外的值均被視爲 false。此屬性是可選的,默認值爲 false。 
Can-Set-Native-Method-Prefix: 布爾值(true 或 false,與大小寫無關)。是否能設置此代理所需的本機方法前綴。true 以外的值均被視爲 false。此屬性是可選的,默認值爲 false。  
 
     代理 JAR 文件在清單中可以同時出現 Premain-Class 和 Agent-Class 屬性。如果代理是使用 -javaagent 選項在命令行上啓動的,那麼 Premain-Class 屬性指定代理類的名稱,Agent-Class 屬性將被忽略。類似地,如果代理是在 VM 啓動後某一時刻啓動的,那麼 Agent-Class 屬性指定代理類的名稱(Premain-Class 屬性的值將被忽略)。 
 
參考文檔:
具體代理jar文檔可參考:http://docs.oracle.com/javase/6/docs/api/index.html (或者Java API文檔java.lang.instrument包說明)
關於簽名和services,可以參考jar 規範:http://docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章