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, как использовать разделы и некоторые общие заголовки. Структура файла манифеста позволяет нам предоставлять стандартную информацию, такую как информация о версии.
Однако его гибкость позволяет нам определять любую информацию, которую мы считаем уместной для описания содержимого наших банок.