Интерфейс Pack200.Packer
- Вложенный класс:
- Pack200
public static interface Pack200.Packer
Двигатель паковщика применяет различные преобразования к входному файлу JAR, делая поток паков высоко сжимаемым с помощью компрессора, такого как gzip или zip. Экземпляр двигателя можно получить, используя Pack200.newPacker(). Высокая степень сжатия достигается с помощью ряда техник, описанных в спецификации JSR 200. Некоторые из этих техник — сортировка, переупорядочение и размещение в постоянном пуле.
Двигатель паковщика инициализируется в начальном состоянии, как описано в его свойствах ниже. Начальное состояние можно изменить, получив свойства двигателя (используя properties()) и сохранив изменённые свойства в карте. Файлы ресурсов будут переданы без изменений. Файлы классов не будут содержать идентичные байты, поскольку распаковщик может изменять незначительные особенности файлов классов, такие как порядок постоянного пула. Однако файлы классов будут семантически идентичны, как указано в Спецификации виртуальной машины Java™.
По умолчанию паковщик не изменяет порядок элементов JAR. Также время изменения и подсказка сжатия каждого элемента JAR передаются без изменений. (Любая другая информация архива ZIP, такая как дополнительные атрибуты, предоставляющие разрешения Unix-файлов, теряется.)
Обратите внимание, что упаковка и распаковка JAR в общем случае изменят байтовый контент файлов классов в JAR. Это означает, что упаковка и распаковка, как правило, аннулируют любые цифровые подписи, которые полагаются на байтовые изображения элементов JAR. Для того чтобы подписать и упаковать JAR, вы должны сначала упаковать и распаковать JAR, чтобы «нормализовать» его, затем вычислить подписи для распакованных элементов JAR и, наконец, переупаковать подписанный JAR. Оба этапа упаковки должны использовать точно те же опции, и предел сегмента также может потребоваться установить в «-1», чтобы предотвратить случайное изменение границ сегментов при незначительном изменении размера файлов классов.
(Вот почему это работает: любое переупорядочение, которое делает паковщик в структуре любого файла класса, идемпотентно, поэтому повторная упаковка не изменяет упорядочения, созданного первой упаковкой. Также распаковщик гарантированно спецификацией JSR 200, что он создаст конкретное байтовое изображение для любого заданного порядка передачи элементов архива.)
Для обеспечения обратной совместимости версия файла пака настраивается для адаптации к файлам классов, присутствующим во входном файле JAR. Другими словами, версия файла пака будет последней, если файлы классов являются последними, и наоборот, версия файла пака будет самой старой, если версии файлов классов также являются самыми старыми. Для промежуточных версий файлов классов будет использована соответствующая версия файла пака. Например: Если входные файлы JAR состоят только из файлов классов версии 1.5 (или более ранних), создаётся совместимый с версией 1.5 файл пака. Это также будет происходить для архивов, не содержащих файлов классов. Если входной файл JAR содержит файл класса версии 1.6, то версия файла пака будет установлена на 1.6.
Примечание: если не указано иное, передача аргумента null в конструктор или метод в этом классе приведёт к тому, что будет брошено исключение NullPointerException.
- С тех пор:
- 1.5
Поля
| Модификатор и тип | Поле и описание |
|---|---|
static String |
CLASS_ATTRIBUTE_PFX При конкатенации с именем атрибута класса указывает формат этого атрибута, используя язык разметки, указанный в спецификации JSR 200. |
static String |
CODE_ATTRIBUTE_PFX При конкатенации с именем атрибута кода указывает формат этого атрибута. |
static String |
DEFLATE_HINT Если это свойство установлено в |
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 Если это свойство установлено в |
static String |
LATEST Строка «latest», возможное значение для некоторых свойств. |
static String |
METHOD_ATTRIBUTE_PFX При конкатенации с именем атрибута метода указывает формат этого атрибута. |
static String |
MODIFICATION_TIME Если это свойство установлено в специальную строку |
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 Указывает действие, которое необходимо выполнить при обнаружении файла класса, содержащего неизвестный атрибут. |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
default void |
addPropertyChangeListener(PropertyChangeListener listener) Устарело. Зависимость от |
void |
pack(JarFile in,
OutputStream out) Принимает JarFile и преобразует его в архив Pack200. |
void |
pack(JarInputStream in,
OutputStream out) Принимает JarInputStream и преобразует его в архив Pack200. |
SortedMap<String,String> |
properties() Получить набор свойств этого двигателя. |
default void |
removePropertyChangeListener(PropertyChangeListener listener) Устарело. Зависимость от |
Поля
SEGMENT_LIMIT
static final String SEGMENT_LIMIT
Это свойство — числовое значение, задающее целевой размер N (в байтах) каждого сегмента архива. Если отдельный входной файл требует больше N байт, он получит свой собственный сегмент архива.
В качестве особого случая, значение -1 создаст один большой сегмент со всеми входными файлами, а значение 0 — по одному сегменту для каждого класса. Более крупные сегменты архива приводят к меньшей фрагментации и лучшему сжатию, но их обработка требует больше памяти.
Размер каждого сегмента оценивается путем подсчета размера каждого входного файла, который будет передан в сегменте, вместе с размером его имени и другими передаваемыми свойствами.
По умолчанию значение равно -1, что означает, что архиватор всегда создаст один выходной файл-сегмент. В случаях, когда генерируются чрезвычайно большие выходные файлы, пользователям настоятельно рекомендуется использовать сегментирование или разбить входной файл на более мелкие JAR-архивы.
JAR-архив размером 10 МБ, сжатый без этого ограничения, обычно сжимается примерно на 10% меньше, но архиватору может потребоваться большая куча Java (примерно в десять раз больше предела сегмента).
- См. также:
- Значения константных полей
KEEP_FILE_ORDER
static final String KEEP_FILE_ORDER
Если это свойство установлено в TRUE, архиватор передаст все элементы в исходном порядке внутри исходного архива.
Если оно установлено в FALSE, архиватор может переупорядочить элементы и также удалить записи каталога JAR, которые не содержат полезной информации для приложений Java. (Как правило, это позволяет добиться лучшего сжатия.)
По умолчанию значение TRUE, что сохраняет входную информацию, но может привести к тому, что передаваемый архив будет больше, чем необходимо.
- См. также:
- Значения константных полей
EFFORT
static final String EFFORT
Если это свойство установлено в одно десятичное число, архиватор использует указанное количество усилий для сжатия архива. Уровень 1 может давать немного больший размер и более высокую скорость сжатия, а уровень 9 займёт намного больше времени, но может обеспечить лучшее сжатие.
Специальное значение 0 указывает архиватору скопировать исходный JAR-файл напрямую без сжатия. Стандарт JSR 200 требует, чтобы любой распаковщик понимал этот специальный случай как пропуск всего архива.
По умолчанию значение 5, что инвестирует умеренное время для получения разумного сжатия.
- См. также:
- Значения константных полей
DEFLATE_HINT
static final String DEFLATE_HINT
Если это свойство установлено в TRUE или FALSE, архиватор соответствующим образом установит подсказку сжатия в выходном архиве и не будет передавать отдельные подсказки сжатия элементов архива.
Если это свойство установлено в специальную строку 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
Указывает действие, которое необходимо выполнить при обнаружении класса файла, содержащего неизвестное атрибут. Возможные значения — строки ERROR, STRIP и PASS.
Строка 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.
Также разрешены специальные строки ERROR, STRIP и PASS с тем же значением, что и 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=. Также разрешены специальные строки ERROR, STRIP и PASS.
- См. также:
-
CLASS_ATTRIBUTE_PFX, Значения константных полей
METHOD_ATTRIBUTE_PFX
static final String METHOD_ATTRIBUTE_PFX
При конкатенации с именем атрибута метода указывает формат этого атрибута. Например, эффект этого параметра встроен: pack.method.attribute.Exceptions=NH[RCH]. Также разрешены специальные строки ERROR, STRIP и PASS.
- См. также:
-
CLASS_ATTRIBUTE_PFX, Значения константных полей
CODE_ATTRIBUTE_PFX
static final String CODE_ATTRIBUTE_PFX
При конкатенации с именем атрибута кода указывает формат этого атрибута. Например, эффект этого параметра встроен: pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]. Также разрешены специальные строки ERROR, STRIP и PASS.
- См. также:
-
CLASS_ATTRIBUTE_PFX, Значения константных полей
PROGRESS
static final String PROGRESS
Прогресс распаковщика в процентах, периодически обновляемый распаковщиком. Значения от 0 до 100 — нормальные, а -1 указывает затор. Прогресс можно отслеживать, опрашивая значение этого свойства.
По меньшей мере, распаковщик должен установить прогресс в 0 в начале операции упаковки и в 100 в конце.
- См. также:
- Значения постоянных полей
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
@Deprecated default void addPropertyChangeListener(PropertyChangeListener listener)
Устаревшее. Зависимость от PropertyChangeListener создаёт существенное препятствие для будущей модулизации платформы Java. Этот метод будет удалён в будущей версии. Приложениям, которым нужно отслеживать прогресс упаковки, следует вместо этого обращаться к значению свойства PROGRESS.
Регистрирует слушатель для событий PropertyChange на карте свойств. Это обычно используется приложениями для обновления индикатора прогресса.
Стандартная реализация этого метода ничего не делает и не имеет побочных эффектов.
ВНИМАНИЕ: Этот метод отсутствует в объявлении интерфейса во всех подмножествах профилей Java SE, не включающих пакет java.beans.
- Параметры:
-
listener— Объект, вызываемый при изменении свойства. - См. также:
-
properties(),PROGRESS
removePropertyChangeListener
@Deprecated default void removePropertyChangeListener(PropertyChangeListener listener)
Устаревшее. Зависимость от PropertyChangeListener создаёт существенное препятствие для будущей модулизации платформы Java. Этот метод будет удалён в будущей версии.
Удаляет слушателя событий PropertyChange, добавленного методом addPropertyChangeListener(java.beans.PropertyChangeListener).
Стандартная реализация этого метода ничего не делает и не имеет побочных эффектов.
ВНИМАНИЕ: Этот метод отсутствует в объявлении интерфейса во всех подмножествах профилей Java SE, не включающих пакет java.beans.
- Параметры:
-
listener— Удаляемый слушатель PropertyChange. - См. также:
addPropertyChangeListener(java.beans.PropertyChangeListener)
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.