Введение

Формат файла Java-архива

JAR ("Java архив") – это формат файла-пакета, обычно используемый для объединения множества файлов классов Java и связанных с ними метаданных и ресурсов (текста, изображений и т.д.) в один файл для распространения. JAR-файлы являются архивными файлами, включающими манифест, специфичный для Java. Они основаны на формате ZIP и обычно имеют расширение .jar.

Дизайн

Файл JAR позволяет среде выполнения Java эффективно развертывать целое приложение, включая его классы и связанные с ними ресурсы, в рамках одного запроса. Элементы JAR-файла могут быть сжаты, что сокращает время загрузки. JAR-файл может содержать файл манифеста, расположенный в каталоге META-INF/MANIFEST.MF. Записи в файле манифеста описывают способ использования JAR-файла. Например, запись Class-Path может использоваться для указания других JAR-файлов, которые необходимо загрузить вместе с данным JAR-файлом.

Экстракция

Содержимое файла можно извлечь с помощью любого программного обеспечения для работы с архивами, поддерживающего формат ZIP, или утилиты командной строки jar, входящей в состав Java Development Kit.

Безопасность

Разработчики могут цифровым способом подписывать JAR-файлы. В этом случае информация о подписи становится частью встроенного манифеста. Сам JAR-файл при этом не подписывается, а вместо этого каждый файл внутри архива перечисляется вместе с его контрольной суммой; подписываются именно эти контрольные суммы. Несколько субъектов могут подписывать JAR-файл, изменяя его при каждом подписании, хотя сами подписанные файлы остаются действительными. При загрузке подписанных JAR-файлов средой выполнения Java, она может проверять подписи и отказываться загружать классы, не соответствующие подписи. Также поддерживаются "запечатанные" пакеты, в которых загрузчик классов (Classloader) разрешает загружать Java-классы в один и тот же пакет только в том случае, если все они подписаны одними и теми же субъектами. Это предотвращает внедрение вредоносного кода в существующий пакет и, следовательно, получение доступа к классам и данным с областью видимости пакета. Содержимое JAR-файлов может быть обфусцировано для затруднения обратной разработки.

Исполняемые файлы JAR

Исполняемая Java-программа может быть упакована в JAR-файл вместе со всеми библиотеками, которые она использует. Исполняемые JAR-файлы содержат манифест, указывающий класс точки входа с помощью записи "Main-Class: myPrograms.MyClass" и явный путь к классам (при этом аргумент `cp` игнорируется). Некоторые операционные системы могут запускать такие файлы непосредственно при двойном щелчке. Типичный способ запуска – команда `java -jar foo.jar` из командной строки. На большинстве платформ можно создавать собственные программы-запускаторы. Например, пользователи Microsoft Windows, предпочитающие иметь файлы Windows EXE, могут использовать такие инструменты, как JSmooth, Launch4J, WinRun4J или Nullsoft Scriptable Install System, чтобы преобразовать отдельные JAR-файлы в исполняемые файлы.

Манифест

Файл манифеста — это файл метаданных, содержащийся в JAR-архиве. Он определяет данные, связанные с расширением и пакетом. Он содержит пары "имя-значение", организованные в секции. Если JAR-файл предназначен для использования как исполняемый файл, файл манифеста указывает главный класс приложения. Файл манифеста имеет имя MANIFEST.MF. Каталог манифеста должен быть первой записью в сжатом архиве.

Технические характеристики

Манифест появляется в каноническом месте META-INF/MANIFEST.MF. В архиве может быть только один файл манифеста, и он должен находиться именно там. Содержимое файла манифеста в JAR-файле, созданном с использованием версии 1.0 Java Development Kit, следующее: Manifest Version: 1.0

Имя отделяется от его значения двоеточием. Манифест по умолчанию указывает на соответствие версии 1.0 спецификации манифеста. Манифест может содержать информацию о других файлах, включенных в архив. Содержимое манифеста зависит от предполагаемого назначения JAR-файла. Файл манифеста по умолчанию не содержит предположений о том, какую информацию следует записывать о других файлах, поэтому его единственная строка содержит данные только о самом себе. Он должен быть закодирован в UTF-8.

Специальные заголовки манифеста

Файлы JAR, созданные исключительно для архивирования, не используют файл MANIFEST.MF. В большинстве случаев JAR-файлы используются не только для простого архивирования и сжатия, но и требуют специальную информацию в файле манифеста.

Особенности

Манифест позволяет разработчикам определять несколько полезных функций для своих JAR-файлов. Свойства задаются в виде пар ключ-значение.

Приложения

Если приложение упаковано в JAR-файл, виртуальной машине Java необходимо знать точку входа приложения. Точкой входа является любой класс, содержащий публичный статический метод `void main(String[] args)`. Эта информация указывается в заголовке манифеста "Main-Class", который имеет следующий общий формат:

`Main-Class: com.example.MyClassName`

В этом примере метод `main` класса `com.example.MyClassName` выполняется при запуске приложения.