JavaTM 2 Platform
Standard Ed. 6

java.util.jar
介面 Pack200.Packer

正在封閉類別:
Pack200

public static interface Pack200.Packer

打包器引擎把各種轉換應用到輸入 JAR 檔案,從而可以通過壓縮器(如 gzip 或 zip)高度壓縮打包串流。可使用 Pack200.newPacker() 獲得該引擎的實例。高度壓縮是通過使用 JSR 200 規範中描述的大量技術來實作的。一些技術包括排序、重排序和常數池的共處。

根據下面所述的打包引擎屬性,將打包引擎初始化為初始狀態。可以通過獲取引擎屬性(使用 properties())並在映射上存儲已修改屬性來操作該初始狀態。資源檔案根本不做任何改動即可通過。類別檔案將不會包含相同的位元組,因為解包器可以隨意改變次要類別檔案的特性,比如常數池的順序。但是類別檔案在語義上將是相同的,這在下面網址的 Java Virtual Machine Specification 中作了規定:http://java.sun.com/docs/books/vmspec/html/ClassFile.doc.html

預設情況下,打包器不改變 JAR 元素的順序。而且不改變每個 JAR 元素的修改時間和壓縮提示。任何其他 ZIP 存檔資訊(如給出 Unix 檔案權限的額外屬性)將會丟失。

注意,打包和解包 JAR 通常將修改 JAR 中類別檔案的位元組內容。這意味著打包和解包通常將使依賴於 JAR 元素位元組圖像的任何數位簽章無效。為了簽章並打包 JAR,您必須首先打包和解包 JAR 來“規範化”它,然後計算解包後 JAR 元素上簽章,最後重新打包簽章的 JAR。打包步驟應該準確地使用相同的選項,可能還需要把段範圍設置為 "-1",以防止在類別檔案大小有所改變時段邊界的意外變化。

(其工作原理如下:打包器對任何類別檔案結構的任何重新排序是冪等的,因此,第二次打包不會改變第一次打包所產生的順序。而且,JSR 200 規範保證解包器可為存檔元素的任何給定傳輸順序產生指定的位元組圖像。)

為了維護向後相容性,如果輸入 JAR 檔案僅由 1.5(或更低版本)類別檔案組成,則產生 1.5 相容的套件檔案。否則,產生 1.6 相容的 pack200 檔案。

從以下版本開始:
1.5

欄位摘要
static String CLASS_ATTRIBUTE_PFX
          當與類別屬性名稱連在一起時,使用 JSR 200 規範中指定的佈局語言指出該屬性的格式。
static String CODE_ATTRIBUTE_PFX
          當與程式碼屬性名稱連在一起時,指出該屬性的格式。
static String DEFLATE_HINT
          如果將此屬性設置為 TRUEFALSE,則打包器將在輸出存檔中設置相應的壓縮提示,並且不傳輸存檔元素的單個壓縮提示。
static String EFFORT
          如果將此屬性設置為單個十進制數字,則打包器將在壓縮存檔時使用指定壓縮級別。
static String ERROR
          字元串 "error",某些屬性的可能值。
static String FALSE
          字元串 "false",某些屬性的可能值。
static String FIELD_ATTRIBUTE_PFX
          當與欄位屬性名稱連在一起時,指出該屬性的格式。
static String KEEP
          字元串 "keep",某些屬性的可能值。
static String KEEP_FILE_ORDER
          如果將此屬性設置為 TRUE,則打包器將按它們在源存檔中的原始順序傳輸所有元素。
static String LATEST
          字元串 "latest",某些屬性的可能值。
static String METHOD_ATTRIBUTE_PFX
          當與方法屬性名稱連在一起時,指出該屬性的格式。
static String MODIFICATION_TIME
          如果將此屬性設置為特殊的字元串 LATEST,則打包器將嘗試在原始存檔中的所有可用條目中確定最後修改時間,或者確定每個段中所有可用條目的最後修改時間。
static String PASS
          字元串 "pass",某些屬性的可能值。
static String PASS_FILE_PFX
          指出檔案應該按位元組傳遞(無壓縮)。
static String PROGRESS
          解包器的百分比進度,由解包器定期更新。
static String SEGMENT_LIMIT
          此屬性是一個數字,給出了每個存檔段的估計目標大小 N(以位元組為單位)。
static String STRIP
          字元串 "strip",某些屬性的可能值。
static String TRUE
          字元串 "true",某些屬性的可能值。
static String UNKNOWN_ATTRIBUTE
          指出遇到包含有未知屬性的類別檔案時所採取的行動。
 
方法摘要
 void addPropertyChangeListener(PropertyChangeListener listener)
          為屬性映射上的 PropertyChange 事件註冊一個偵聽器。
 void pack(JarFile in, OutputStream out)
          接收 JarFile 並將其轉換為 Pack200 存檔。
 void pack(JarInputStream in, OutputStream out)
          接收 JarInputStream 並將其轉換成 Pack200 存檔。
 SortedMap<String,String> properties()
          獲取此引擎屬性集。
 void removePropertyChangeListener(PropertyChangeListener listener)
          移除由 addPropertyChangeListener(java.beans.PropertyChangeListener) 所添加的 PropertyChange 事件偵聽器。
 

欄位詳細資訊

SEGMENT_LIMIT

static final String SEGMENT_LIMIT
此屬性是一個數字,給出了每個存檔段的估計目標大小 N(以位元組為單位)。如果單個輸入檔案要求超過 N 位元組,那麼將給出它自己的存檔段。

作為特殊情況,值 -1 將產生使用所有輸入檔案的單個大段,而值 0 將為每個類別產生一個段。較大的存檔段將帶來較少的碎片和更好的壓縮,但處理它們要求更多的記憶體。

每個段的大小是通過計算段中要傳輸的每個輸入檔案的大小,以及它的名稱和其他要傳輸的屬性的大小來估算的。

預設為 1000000(1 百萬位元組)。這允許在一個段中傳輸中等大小的輸入 JAR 檔案。它也限制了打包器和解包器的記憶體要求。

如果沒有此限制,打包一個 10 Mb 的 JAR 通常要小 10%,但打包器可能要求較大的 Java 堆積(heap)空間(大約是段範圍的 10 倍)。

另請參見:
常數欄位值

KEEP_FILE_ORDER

static final String KEEP_FILE_ORDER
如果將此屬性設置為 TRUE,則打包器將按它們在源存檔中的原始順序傳輸所有元素。

如果將其設置為 FALSE,則打包器可能重新排序元素,並且移除攜帶無用資訊(針對 Java 應用程序來說)的 JAR 目錄條目。(通常這支持更好的壓縮。)

預設為 TRUE,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。

另請參見:
常數欄位值

EFFORT

static final String EFFORT
如果將此屬性設置為單個十進制數字,則打包器將在壓縮存檔時使用指定壓縮級別。1 級可能產生較大的尺寸但壓縮速度較快,而 9 級將花費較長的時間,但可能產生更好的壓縮。

特殊值 0 指示打包器直接複製原始的 JAR 檔案(無壓縮)。JSR 200 標準要求任何解包器將此特殊情況作為直接傳輸整個存檔來理解。

預設為 5,花費適量的時間來產生合理的壓縮。

另請參見:
常數欄位值

DEFLATE_HINT

static final String DEFLATE_HINT
如果將此屬性設置為 TRUEFALSE,則打包器將在輸出存檔中設置相應的壓縮提示,並且不傳輸存檔元素的單個壓縮提示。

如果將此屬性設置為特殊字元串 KEEP,則打包器將嘗試確定輸入存檔中每個可用元素的單個壓縮提示,並單獨傳輸此提示。

預設為 KEEP,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。

這取決於解包器實作在提示上採取的行動,以便合適地壓縮得到的未打包 jar 的元素。

ZIP 或 JAR 元素的壓縮提示指出元素是壓縮的還是直接存儲的。

另請參見:
常數欄位值

MODIFICATION_TIME

static final String MODIFICATION_TIME
如果將此屬性設置為特殊的字元串 LATEST,則打包器將嘗試在原始存檔中的所有可用條目中確定最後修改時間,或者確定每個段中所有可用條目的最後修改時間。此單值將作為段的一部分傳輸,並應用到每個段 (SEGMENT_LIMIT) 的所有條目。

這或多或少可以減少存檔的傳輸大小,其代價是將所有已安裝檔案設置為單一日期。

如果將此屬性設置為特殊字元串 KEEP,則打包器傳輸每個輸入元素的單獨修改時間。

預設為 KEEP,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。

這取決於解包器實作所採取的行動,以便合適地設置其輸出檔案中每個元素的修改時間。

另請參見:
SEGMENT_LIMIT, 常數欄位值

PASS_FILE_PFX

static final String PASS_FILE_PFX
指出檔案應該按位元組傳遞(無壓縮)。通過指定添加有不同字元串的其他屬性,以產生具有公共前綴的屬性系列,可以指定多個檔案。

除了用 JAR 檔案分隔符 '/' 替代系統檔案分隔符以外,無任何路徑名轉換。

得到的檔案名必須正好比對其在 JAR 檔案中出現的字元串。

如果屬性值是一個目錄名稱,那麼還將傳遞該目錄下的所有檔案。

範例:


     Map p = packer.properties();
     p.put(PASS_FILE_PFX+0, "mutants/Rogue.class");
     p.put(PASS_FILE_PFX+1, "mutants/Wolverine.class");
     p.put(PASS_FILE_PFX+2, "mutants/Storm.class");
     # Pass all files in an entire directory hierarchy:
     p.put(PASS_FILE_PFX+3, "police/");
 
.

另請參見:
常數欄位值

UNKNOWN_ATTRIBUTE

static final String UNKNOWN_ATTRIBUTE
指出遇到包含有未知屬性的類別檔案時所採取的行動。可能值為字元串 ERRORSTRIPPASS

字元串 ERROR 意味著整體打包操作將失敗,並拋出 IOException 型別的異常。字元串 STRIP 意味著該屬性將被刪除。字元串 PASS 意味著整個類別檔案將在無壓縮下通過(就像它是一個資源檔案一樣),並有合適的警告。這是此屬性的預設值。

範例:


     Map p = pack200.getProperties();
     p.put(UNKNOWN_ATTRIBUTE, ERROR);
     p.put(UNKNOWN_ATTRIBUTE, STRIP);
     p.put(UNKNOWN_ATTRIBUTE, PASS);
 

另請參見:
常數欄位值

CLASS_ATTRIBUTE_PFX

static final String CLASS_ATTRIBUTE_PFX
當與類別屬性名稱連在一起時,使用 JSR 200 規範中指定的佈局語言指出該屬性的格式。

例如,此選項的效果內置於:pack.class.attribute.SourceFile=RUH

還允許特殊字元串 ERRORSTRIPPASS,與 UNKNOWN_ATTRIBUTE 具有相同的含義。這提供了一種方式,讓使用者可以請求按位拒絕、清除或傳遞特定的屬性(不進行類別壓縮)。

下面的程式碼可用於支持 JCOV 屬性:


     Map p = packer.properties();
     p.put(CODE_ATTRIBUTE_PFX+"CoverageTable",       "NH[PHHII]");
     p.put(CODE_ATTRIBUTE_PFX+"CharacterRangeTable", "NH[PHPOHIIH]");
     p.put(CLASS_ATTRIBUTE_PFX+"SourceID",           "RUH");
     p.put(CLASS_ATTRIBUTE_PFX+"CompilationID",      "RUH");
 

下面的程式碼可用於清除除錯屬性:


     Map p = packer.properties();
     p.put(CODE_ATTRIBUTE_PFX+"LineNumberTable",    STRIP);
     p.put(CODE_ATTRIBUTE_PFX+"LocalVariableTable", STRIP);
     p.put(CLASS_ATTRIBUTE_PFX+"SourceFile",        STRIP);
 

另請參見:
常數欄位值

FIELD_ATTRIBUTE_PFX

static final String FIELD_ATTRIBUTE_PFX
當與欄位屬性名稱連在一起時,指出該屬性的格式。例如,此選項的效果內置於:pack.field.attribute.Deprecated=。還允許特殊字元串 ERRORSTRIPPASS

另請參見:
CLASS_ATTRIBUTE_PFX, 常數欄位值

METHOD_ATTRIBUTE_PFX

static final String METHOD_ATTRIBUTE_PFX
當與方法屬性名稱連在一起時,指出該屬性的格式。例如,此選項的效果內置於:pack.method.attribute.Exceptions=NH[RCH]。還允許特殊字元串 ERRORSTRIPPASS

另請參見:
CLASS_ATTRIBUTE_PFX, 常數欄位值

CODE_ATTRIBUTE_PFX

static final String CODE_ATTRIBUTE_PFX
當與程式碼屬性名稱連在一起時,指出該屬性的格式。例如,此選項的效果內置於:pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]。還允許特殊字元串 ERRORSTRIPPASS

另請參見:
CLASS_ATTRIBUTE_PFX, 常數欄位值

PROGRESS

static final String PROGRESS
解包器的百分比進度,由解包器定期更新。值 0 - 100 是正常的,-1 指示停止。用 PropertyChangeListener 觀察此屬性。

至少,解包器必須在打包操作開始時把進度設置為 0,在結束時把進度設置為 100。

另請參見:
addPropertyChangeListener(java.beans.PropertyChangeListener), 常數欄位值

KEEP

static final String KEEP
字元串 "keep",某些屬性的可能值。

另請參見:
DEFLATE_HINT, MODIFICATION_TIME, 常數欄位值

PASS

static final String PASS
字元串 "pass",某些屬性的可能值。

另請參見:
UNKNOWN_ATTRIBUTE, CLASS_ATTRIBUTE_PFX, FIELD_ATTRIBUTE_PFX, METHOD_ATTRIBUTE_PFX, CODE_ATTRIBUTE_PFX, 常數欄位值

STRIP

static final String STRIP
字元串 "strip",某些屬性的可能值。

另請參見:
UNKNOWN_ATTRIBUTE, CLASS_ATTRIBUTE_PFX, FIELD_ATTRIBUTE_PFX, METHOD_ATTRIBUTE_PFX, CODE_ATTRIBUTE_PFX, 常數欄位值

ERROR

static final String ERROR
字元串 "error",某些屬性的可能值。

另請參見:
UNKNOWN_ATTRIBUTE, CLASS_ATTRIBUTE_PFX, FIELD_ATTRIBUTE_PFX, METHOD_ATTRIBUTE_PFX, CODE_ATTRIBUTE_PFX, 常數欄位值

TRUE

static final String TRUE
字元串 "true",某些屬性的可能值。

另請參見:
KEEP_FILE_ORDER, DEFLATE_HINT, 常數欄位值

FALSE

static final String FALSE
字元串 "false",某些屬性的可能值。

另請參見:
KEEP_FILE_ORDER, DEFLATE_HINT, 常數欄位值

LATEST

static final String LATEST
字元串 "latest",某些屬性的可能值。

另請參見:
MODIFICATION_TIME, 常數欄位值
方法詳細資訊

properties

SortedMap<String,String> properties()
獲取此引擎屬性集。此集合是「實時視圖」,所以更改其內容可立即影響 Packer 引擎,並且在映射中可立即見到引擎中的變化(如進度指示)。

屬性映射可能包含指定和預設屬性的預定義實作。鼓勵使用者在修改已存在的屬性前閱讀該資訊,並完全理解其含意。

特定實作的屬性是用與實作者相關的套件名稱作前綴的,以 com. 或類似前綴開頭。以 pack.unpack. 開頭的所有屬性名稱保留給此 API 使用。

未知屬性可以用未指定的錯誤忽略或拒絕,並且無效的條目可能導致拋出未指定的錯誤。

返回的映射實作了所有可選的 SortedMap 操作。

返回:
屬性鍵字元串到屬性值的有序關聯。

pack

void pack(JarFile in,
          OutputStream out)
          throws IOException
接收 JarFile 並將其轉換為 Pack200 存檔。

關閉其輸入,但並不關閉其輸出。(Pack200 存檔是可添加的。)

參數:
in - 一個 JarFile
out - 一個 OutputStream
拋出:
IOException - 如果遇到錯誤

pack

void pack(JarInputStream in,
          OutputStream out)
          throws IOException
接收 JarInputStream 並將其轉換成 Pack200 存檔。

關閉其輸入,但並不關閉其輸出。(Pack200 存檔是可添加的。)

對於 JAR 清單檔案及其包含的目錄,修改時間和壓縮提示屬性是不可用的。

參數:
in - 一個 JarInputStream
out - 一個 OutputStream
拋出:
IOException - 如果遇到錯誤
另請參見:
MODIFICATION_TIME, DEFLATE_HINT

addPropertyChangeListener

void addPropertyChangeListener(PropertyChangeListener listener)
為屬性映射上的 PropertyChange 事件註冊一個偵聽器。通常應用程序使用它來更新進度條。

參數:
listener - 更改屬性時要調用的物件。
另請參見:
properties(), PROGRESS

removePropertyChangeListener

void removePropertyChangeListener(PropertyChangeListener listener)
移除由 addPropertyChangeListener(java.beans.PropertyChangeListener) 所添加的 PropertyChange 事件偵聽器。

參數:
listener - 要移除的 PropertyChange 偵聽器。
另請參見:
addPropertyChangeListener(java.beans.PropertyChangeListener)

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only