Файл JAR («архив Java») — это формат файла пакета, обычно используемый для объединения множества файлов классов Java и связанных с ними метаданных и ресурсов (текста, изображений и т. д.) в один файл для распространения. [4]
Файлы JAR представляют собой архивные файлы , включающие файл манифеста, специфичный для Java . Они созданы на основе формата ZIP и обычно имеют .jar
расширение файла . [5]
Файл JAR позволяет средам выполнения Java эффективно развертывать все приложение, включая его классы и связанные с ними ресурсы, в одном запросе. Элементы файла JAR могут быть сжаты, что сокращает время загрузки.
Файл JAR может содержать файл манифеста, который находится в META-INF/MANIFEST.MF
. Записи в файле манифеста описывают, как использовать файл JAR. Например, запись Classpath может использоваться для указания других файлов JAR для загрузки с JAR.
Содержимое файла можно извлечь с помощью любого программного обеспечения для извлечения архивов, поддерживающего формат ZIP, или с jar
помощью утилиты командной строки, входящей в состав Java Development Kit.
Разработчики могут подписывать JAR-файлы цифровой подписью . В этом случае информация о подписи становится частью встроенного файла манифеста. Сам JAR-файл не подписан, но вместо этого каждый файл внутри архива указан вместе со своей контрольной суммой; именно эти контрольные суммы подписаны. Несколько сущностей могут подписывать JAR-файл, изменяя сам JAR-файл с каждой подписью, хотя сами подписанные файлы остаются действительными. Когда среда выполнения Java загружает подписанные JAR-файлы, она может проверять подписи и отказываться загружать классы, которые не соответствуют подписи. Она также может поддерживать «запечатанные» пакеты, в которых Classloader разрешает загрузку классов Java в один и тот же пакет, только если они все подписаны одними и теми же сущностями. Это предотвращает вставку вредоносного кода в существующий пакет и, таким образом, получение доступа к классам и данным в области действия пакета.
Содержимое JAR-файлов может быть замаскировано , чтобы затруднить обратную разработку .
Исполняемая программа Java может быть упакована в файл JAR вместе с любыми библиотеками, которые использует программа. Исполняемые файлы JAR имеют манифест, указывающий класс точки входаMain-Class: myPrograms.MyClass
, и явный Class-Path (и аргумент -cp игнорируется). Некоторые операционные системы могут запускать их напрямую при щелчке. Типичный вызов — java -jar foo.jar
из командной строки.
Собственные лаунчеры можно создавать на большинстве платформ. Например, пользователи Microsoft Windows, предпочитающие файлы Windows EXE, могут использовать такие инструменты, как JSmooth, Launch4J, WinRun4J или Nullsoft Scriptable Install System, чтобы обернуть отдельные файлы JAR в исполняемые файлы.
Файл манифеста — это файл метаданных , содержащийся в JAR. [6] [7] Он определяет данные, связанные с расширением и пакетом. Он содержит пары имя-значение, организованные в разделы. Если файл JAR предназначен для использования в качестве исполняемого файла, файл манифеста указывает основной класс приложения. Файл манифеста называется MANIFEST.MF
. Каталог манифеста должен быть первой записью сжатого архива.
Манифест появляется в каноническом месте META-INF/MANIFEST.MF
. [8] В архиве может быть только один файл манифеста, и он должен находиться в этом месте.
Содержимое файла манифеста в JAR-файле, созданном с помощью Java Development Kit версии 1.0, выглядит следующим образом.
Версия манифеста: 1.0
Имя отделено от значения двоеточием. Манифест по умолчанию показывает, что он соответствует версии 1.0 спецификации манифеста.
Манифест может содержать информацию о других файлах, упакованных в архив. Содержимое манифеста зависит от предполагаемого использования файла JAR. Файл манифеста по умолчанию не делает никаких предположений о том, какую информацию он должен записывать о других файлах, поэтому его единственная строка содержит данные только о нем самом. Он должен быть закодирован в UTF-8.
Файлы JAR, созданные только в целях архивирования, не используют MANIFEST.MF
файл.
Большинство применений JAR-файлов выходят за рамки простого архивирования и сжатия и требуют наличия специальной информации в файле манифеста.
Манифест позволяет разработчикам определять несколько полезных функций для своих jar-файлов. Свойства указываются в парах ключ-значение.
Если приложение содержится в файле JAR, то виртуальная машина Java должна знать точку входа приложения. Точкой входа является любой класс с public static void main(String[] args)
методом. Эта информация предоставляется в заголовке Main-Class манифеста, который имеет общую форму:
Основной класс: com.example.MyClassName
В этом примере com.example.MyClassName.main()
выполняется при запуске приложения.
При желании пакет в файле JAR может быть запечатан, что означает, что все классы, определенные в этом пакете, архивируются в том же файле JAR. Пакет может быть запечатан для обеспечения согласованности версий между классами в программном обеспечении или в качестве меры безопасности.
Чтобы запечатать пакет, необходимо указать поле «Имя», а затем заголовок «Запечатано», например:
Имя : myCompany/myPackage/ Запечатано : true
Значение заголовка Name — это относительное имя пути пакета. Обратите внимание, что оно заканчивается на '/', чтобы отличить его от имени файла. Любые заголовки, следующие за заголовком Name, без каких-либо промежуточных пустых строк, применяются к файлу или пакету, указанному в заголовке Name. В приведенном выше примере, поскольку Sealed
заголовок следует за Name: myCompany/myPackage
заголовком без промежуточных пустых строк, Sealed
заголовок применяется (только) к пакету myCompany/myPackage
.
Функция запечатанных пакетов устарела из-за системы модулей платформы Java, представленной в Java 9, в которой модули не могут разделять пакеты. [9]
Несколько заголовков манифеста содержат информацию о версиях. Каждому пакету можно назначить один набор заголовков. Заголовки версий отображаются непосредственно под заголовком Name для пакета. В этом примере показаны все заголовки версий:
Имя : java/util/ Заголовок спецификации : "Java Utility Classes" Версия спецификации : "1.2" Поставщик спецификации : "Sun Microsystems, Inc.". Заголовок реализации : "java.util" Версия реализации : "build57" Поставщик реализации : "Sun Microsystems, Inc."
При желании jar-файл может быть помечен как многорелизный jar-файл. Использование функции многорелизности позволяет разработчикам библиотек загружать разный код в зависимости от версии среды выполнения Java. [10] Это, в свою очередь, позволяет разработчикам использовать новые функции, не жертвуя совместимостью.
Многорелизный jar-файл включается с помощью следующего объявления в манифесте:
Мульти-релиз : правда
Файл MANIFEST.MF
можно использовать для указания всех классов, которые необходимо загрузить для запуска приложения. [11]
Обратите внимание, что записи Class-Path разделяются пробелами, а не разделителем системного пути:
Путь к классу : . pkg1.jar путь/к/pkg2.jar
Инструмент сборки Apache Ant имеет собственный пакет для чтения и записи архивов Zip и JAR, включая поддержку расширений файловой системы Unix . Пакет org.apache.tools.zip выпущен под лицензией Apache Software Foundation и предназначен для использования вне Ant.
На основе формата JAR создано несколько связанных форматов файлов:
service.xml
файл и сопутствующие файлы JAR.