Подтвердить что ты не робот

Использование файла MANIFEST.MF в Java

Я заметил, что файлы JAR, WAR и EAR имеют файл MANIFEST.MF в папке META-INF.

Каково использование файла MANIFEST.MF? Что все вещи могут быть указаны в этом файле?

4b9b3361

Ответ 1

Содержимое файла манифеста в файле JAR, созданное с версией 1.0 Java Development Kit, является следующим.

Manifest-Version: 1.0

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

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

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

Main-Class: classname

Имя класса value должно быть заменено точкой ввода приложения.

Расширения загрузки:. Загрузка расширений - это файлы JAR, на которые ссылаются файлы манифеста других JAR файлов. В типичной ситуации апплет будет связан в файле JAR, чей манифест ссылается на файл JAR (или несколько файлов JAR), который будет служить расширением для целей этого апплета. Расширения могут ссылаться друг на друга таким же образом. Расширения загрузки указаны в поле заголовка Class-Path в файле манифеста апплета, приложения или другого расширения. Заголовок Class-Path может выглядеть так:

Class-Path: servlet.jar infobus.jar acme/beans.jar

В этом заголовке классы в файлах servlet.jar, infobus.jar и acme/ beans.jar будут служить расширениями для апплета или приложения. URL-адреса в заголовке Class-Path указываются относительно URL-адреса файла JAR апплета или приложения.

Уплотнение пакета: Пакет в JAR файле может быть произвольно запечатан, что означает, что все классы, определенные в этом пакете, должны быть заархивированы в одном JAR файле. Пакет может быть запечатан для обеспечения совместимости версий между классами вашего программного обеспечения или мерой безопасности. Чтобы запечатать пакет, для пакета должен быть добавлен заголовок Name, за которым следует заголовок Sealed, похожий на это:

Name: myCompany/myPackage/
Sealed: true

Значение заголовка Name - это относительный путь к пакету. Обратите внимание, что он заканчивается символом '/', чтобы отличить его от имени файла. Любые заголовки, следующие за заголовком Name, без каких-либо промежуточных пустых строк, относятся к файлу или пакету, указанному в заголовке Name. В приведенном выше примере, поскольку заголовок Sealed появляется после заголовка Name: myCompany/myPackage, без пустых строк между ними, заголовок Sealed будет интерпретироваться как применяемый (только) к пакету myCompany/myPackage.

Версии пакетов: Спецификация версии пакета определяет несколько заголовков манифеста для хранения информации о версиях. Каждому пакету может быть присвоен один набор таких заголовков. Заголовки версий должны отображаться непосредственно под заголовком Name для пакета. В этом примере показаны все заголовки версий:

Name: java/util/
Specification-Title: "Java Utility Classes" 
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util" 
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."

Ответ 2

Manifest.MF содержит информацию о файлах, содержащихся в файле JAR.

Всякий раз, когда создается JAR файл, файл manifest.mf по умолчанию создается внутри папки META-INF и содержит записи по умолчанию, подобные этому:

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)

Это записи как пары "header: value". Первая специфицирует версию манифеста, а вторая указывает версию JDK, с которой создается файл JAR.

Заголовок основного класса: Когда JAR файл используется для связывания приложения в пакете, нам нужно указать класс, служащий точкой входа приложения. Мы предоставляем эту информацию, используя заголовок Main-Class файла манифеста,

Основной класс: {полное имя класса}

Значение Main-Class здесь - это класс, имеющий основной метод. После указания этой записи мы можем запустить JAR файл для запуска приложения.

Заголовок класса: В большинстве случаев нам нужно получить доступ к другим JAR файлам из классов, упакованных в JAR файл приложений. Это можно сделать, предоставив свои полные пути в файле манифеста, используя "заголовок класса-класса",

Класс-путь: {jar1-name jar2-name directory-name/jar3-name}

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

Заголовки, связанные с версией пакета: Когда JAR файл используется для управления версиями пакетов, следующие заголовки используются в соответствии с спецификацией языка Java:

Headers in a manifest
Header                  | Definition
-------------------------------------------------------------------
Name                    | The name of the specification.
Specification-Title     | The title of the specification.
Specification-Version   | The version of the specification.
Specification-Vendor    | The vendor of the specification.
Implementation-Title    | The title of the implementation.
Implementation-Version  | The build number of the implementation.
Implementation-Vendor   | The vendor of the implementation.

Связанные с упаковкой уплотнения:

Мы также можем указать, должны ли быть закрыты какие-либо конкретные пакеты внутри JAR файла, что означает, что все классы, определенные в этом пакете, должны быть заархивированы в том же файле JAR. Это можно указать с помощью "Запечатанный заголовок",

Название: {package/some-package/} Герметичный: истинно

Здесь имя пакета должно заканчиваться на "/.

Повышение безопасности с файлами манифеста:

Мы можем использовать записи файлов манифеста, чтобы обеспечить безопасность веб-приложения или апплета, которые он упаковывает, с различными атрибутами: "Разрешения", "Codebae", "Имя приложения", "Надежность и многое другое".

Папка META-INF:

В этой папке находится файл манифеста. Кроме того, он может содержать больше файлов, содержащих метаданные о приложении. Например, в JAR файле модуля EJB эта папка содержит дескриптор развертывания EJB для модуля EJB вместе с файлом манифеста для JAR. Кроме того, он содержит файл xml, содержащий сопоставление абстрактных ссылок EJB с конкретными ресурсами контейнера сервера приложений, на котором он будет запущен.

Справка:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html