Рубрики
Без рубрики

Понимание файла манифеста JAR

Узнайте о файле манифеста JAR, его возможностях и многом другом.

Автор оригинала: baeldung.

1. введение

Архив Java (JAR) описывается файлом манифеста. В этой статье рассматриваются его многочисленные возможности, включая добавление атрибуции, создание исполняемого файла JAR и встраивание информации об управлении версиями.

Однако давайте начнем с краткого обзора того, что такое файл манифеста.

2. Файл Манифеста

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

Эти заголовки предоставляют метаданные, которые помогают нам описать аспекты нашей JAR, такие как версии пакетов, класс приложения для выполнения, путь к классу, материал подписи и многое другое.

3. Добавление файла манифеста

3.1. Манифест по Умолчанию

Файл манифеста добавляется автоматически всякий раз, когда мы создаем банку .

Например, если мы создадим JAR в OpenJDK 11:

jar cf MyJar.jar classes/

Он создает очень простой файл манифеста:

Manifest-Version: 1.0
Created-By: 11.0.3 (AdoptOpenJDK)

3.2. Пользовательский Манифест

Или мы можем указать ваш собственный файл манифеста.

Например, предположим, что у нас есть пользовательский файл манифеста с именем manifest.txt :

Built-By: baeldung

Мы можем включить этот файл и jar объединит его с файлом манифеста по умолчанию при использовании опции m :

jar cfm MyJar.jar manifest.txt classes/

Затем результирующий файл манифеста:

Manifest-Version: 1.0
Built-By: baeldung
Created-By: 11.0.3 (AdoptOpenJDK)

3.3. Maven

Теперь содержимое файла манифеста по умолчанию изменяется в зависимости от того, какие инструменты мы используем.

Например, Maven добавляет некоторые дополнительные заголовки:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.3.9
Built-By: baeldung
Build-Jdk: 11.0.3

Мы действительно можем настроить эти заголовки в нашем pom.

Скажем, например, что мы хотим указать, кем была создана банка и пакет:


    org.apache.maven.plugins
    maven-jar-plugin
    3.1.2
    
        
            
                com.baeldung.java
            
            
                baeldung
            
        
    

При этом создается файл манифеста с пользовательскими заголовками package и created-by :

Manifest-Version: 1.0
Build-Jdk-Spec: 11
Package: com.baeldung.java
Created-By: baeldung

Полный список опций см. в документации по плагину Maven JAR .

4. Заголовки

Заголовок должен соответствовать определенному формату и разделяться новой строкой:

key1: value1
Key2: value2

Допустимый заголовок должен содержать пробел между двоеточием и значением . Еще один важный момент заключается в том, что в конце файла должна быть новая строка . В противном случае последний заголовок игнорируется.

Давайте рассмотрим некоторые стандартные заголовки из спецификации | и некоторые общие пользовательские заголовки.

4.1. Основные заголовки

Основные заголовки обычно содержат общую информацию:

  • Manifest-Version : версия спецификации
  • Created-By : версия инструмента и поставщик, создавшие файл манифеста
  • Multi-Release : если true , то это Многоразрядная банка
  • Встроенный : в этом пользовательском заголовке указывается имя пользователя, создавшего файл манифеста

4.2. Точка входа и Путь к классу

Если наш JAR содержит выполняемое приложение, мы можем указать точку входа. Аналогично, мы можем предоставить путь к классу . Поступая таким образом, мы избегаем необходимости указывать его, когда мы хотим его запустить.

  • Main-Class : пакет и имя класса с основным методом (без расширения класса)
  • Class-Path : разделенный пробелом список относительных путей к библиотекам или ресурсам

Например, если ваша точка входа в приложение находится в Application.class и он использует библиотеки и ресурсы, тогда мы можем добавить необходимые заголовки:

Main-Class: com.baeldung.Application
Class-Path: core.jar lib/ properties/

Путь к классу включает в себя core.jar и все файлы в каталогах lab и properties . Эти активы загружаются относительно того, где выполняется JAR, а не из самой JAR . Другими словами, они должны существовать вне БАНКИ.

4.3. Версия упаковки и герметизация

Эти стандартные заголовки описывают пакеты в банке.

  • Имя : пакет
  • Реализация-Дата сборки : дата сборки для реализации
  • Реализация-Название : название реализации
  • Реализация-Поставщик : поставщик для реализации
  • Версия реализации : версия реализации
  • Спецификация-Заголовок : заголовок спецификации
  • Спецификация-Поставщик : поставщик для спецификации
  • Спецификация-Версия : версия спецификации
  • Sealed : если true, то все классы для пакета исходят из одной и той же банки (по умолчанию false)

Например, мы находим эти заголовки манифеста в соединителе драйверов MySQL/J JAR . Они описывают версию спецификации JDBC, которой соответствует JAR, а также версию самого драйвера:

Specification-Title: JDBC
Specification-Version: 4.2
Specification-Vendor: Oracle Corporation
Implementation-Title: MySQL Connector/J
Implementation-Version: 8.0.16
Implementation-Vendor: Oracle

4.4. Подписанная банка

Мы можем подписать вашу банку цифровой подписью, чтобы добавить дополнительную безопасность и проверку. Хотя этот процесс выходит за рамки данной статьи, при этом в файл манифеста добавляются стандартные заголовки, показывающие каждый подписанный класс и его закодированную подпись . Пожалуйста, ознакомьтесь с документацией JAR signing для получения более подробной информации.

4.5. OSGI

Обычно также можно увидеть пользовательские заголовки для пакетов OSGI:

  • Имя пакета : название
  • Bundle-SymbolicName : уникальный идентификатор
  • Bundle-Версия : версия
  • Import-Package : пакеты и версии, от которых зависит комплект
  • Export-Package : пакеты пакетов и версии, доступные для использования

См.нашу статью Введение в OSGI, чтобы узнать больше о пакетах OSGI.

5. Разделы

В файле манифеста есть два типа разделов: основной и для каждой записи. Заголовки, которые появляются в главном разделе, применяются ко всему, что находится в БАНКЕ . В то время как заголовки , которые появляются в разделах для каждой записи, применяются только к именованному пакету или классу .

Кроме того, заголовок, появляющийся в разделе для каждой записи, переопределяет тот же заголовок в основном разделе. Обычно разделы для каждой записи содержат информацию о версиях пакетов и печати, а также цифровую подпись.

Давайте рассмотрим простой пример раздела для каждой записи:

Implementation-Title: baeldung-examples 
Implementation-Version: 1.0.1
Implementation-Vendor: Baeldung
Sealed: true

Name: com/baeldung/utils/
Sealed: false

Основная секция в верхней части запечатала все пакеты в нашей БАНКЕ. Тем не менее, пакет com.baeldung.utils не запечатан разделом для каждой записи.

6. Заключение

В этой статье представлен обзор того, как добавить файл манифеста в JAR, как использовать разделы и некоторые общие заголовки. Структура файла манифеста позволяет нам предоставлять стандартную информацию, такую как информация о версии.

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