Manifest mf что это
Скачать Книгу: JAR | TXT | TXT в ZIP | Doc | всё в zip
Скачать Программы: По отдельности | Все в ZIP
Папка Meta-inf с файлом meta-inf имеется в каждой игре.
Что же такое Meta-inf файл? -Это основной файл каждой игры.
Для чего Он нужен? -Для полноценной работы игры.
За что Он отвечает? -В нем прописывается от имени до размера.
Какие основные характеристики meta-inf? -Рассмотрим строение простейшего файла из папки meta-inf. А Он выглядит так:
Manifest-Version: 1.0 (версия игры)
Ant-Version: Apache Ant 1.6.5 Created-By: 1.5.0_05-b05 (Sun Microsystems Inc.) (Система Производитель)
MIDlet-1: Escape,/icono.png (путь к иконке игры),escape.Escape (файл запуска)
MIDlet-Vendor: Vendor (создатель)
MIDlet-Icon: /icono.png (картинка на оглавление)
MIDlet-Version: 1.0 (версия) .
MIDlet-Name: Escape (имя игры)
MicroEdition-Configuration: CLDC-1.0 (экран телефона)
MicroEdition-Profile: MIDP-2.0 (версия для запуска на определенном телефоне с поддержкой)
(Информация на файл о поставщике или другая информация. Когда вы создаете JAR- файл, он автоматически получает файл манифеста по умолчанию . В архиве есть только один файл манифеста, он всегда имеет имя M E T A- I N F /M A N I F E S T . M F. Когда JAR-файл создается версией 1.2 JavaTM Development Kit, манифест по умолчанию очень простой . Вот его полное содержимое:
M a n i f e s t — V e r s i on : 1 . 0
N a m e : j a v a /m a t h / B i gD e c i m a l . c l a s s
SH A 1 — D i g e s t : TD 1 G Z t 8 G 1 1 dXY 2 p4 o l S Z P c 5 R j 6 4 = \ M D 5 — D i g e s t : z 6 z 8 x P j 2 A W / Q 9 A k RS P F 0 c g = = \ N a m e : j a v a /m a t h / B i g I n t e g e r . c l a s s \ SH A 1 — D i g e s t : oB m r v I k BnS x d N Z z P h5 i L y F 0 S + bE = \ M D 5 — D i g e s t : w F y m h D K j Nr eN Z 4 AzD W W g 1Q = = \ Как и в JDK 1.2, в JDK \ 1.1 манифест имеет
элемент для M a n i f e s t — V e r s i on. Номер версии тот же, показывающий, что спецификация манифеста не изменилась между версиями 1.1 и 1.2 JDK. Однако файл манифеста в JDK 1.2 имеет элементы для всех файлов , содержащихся в архиве , включая полные имена файла и значения дайджеста. Полные имена даются как значения заголовка N a m e . Любые заголовки, следующие за заголовком N a m e без пустых строк между ними , относятся к файлу, заданному заголовком N a m e . В приведенном выше \ манифесте , например, за первым заголовком \ N a m e следуют такие \ строки: \ SH A 1 — D i g e s t : TD 1 G Z t 8 G 1 1 dXY 2 p4 o l S Z P c 5 R j 6 4 = \ M D 5 — D i g e s t : z 6 z 8 x P j 2 A W / Q 9 A k RS P F 0 c g = = \ Поскольку эти строки следуют за заголовком N a m e без пустых строк между ними , вы знаете, что значения дайджеста, которые они задают, являются значениями дайджеста для файла j a v a /m a t h /
B i gD e c i m a l . c l a s s . Значения дайджеста относятся только к подписанным JAR- файлам. Фактически, именно поэтому информации дайджеста нет в манифесте по умолчанию JDK 1.2 — она не всегда нужна. Чтобы узнать больше о дайджестах и подписях , см. урок Подписание и проверка аутентичности JAR- файлов.
Что хранится в файле манифеста?
В JAR архиве можно найти файл META-INF/MANIFEST.MF . Это манифест архива – хранилище его метаинформации. Манифест обычно добавляется той же утилитой, которой собирается jar-файл: maven-jar-plugin , команда JDK jar .
Манифест – текстовый файл, который состоит из заголовков, строчек вида ключ: значение . Заголовки разделены на секции. Файл начинается с главной секции, описывающей метаинформацию всего архива. Следом, отделенные пустыми строками, идут секции для отдельных пакетов и файлов. В них могут переопределяться общие заголовки. JVM игнорирует неизвестные ей заголовки, что позволяет сторонним утилитам хранить в манифесте свою специфичную метаинформацию.
Вот некоторые из часто используемых заголовков:
• Информация об архиве: Manifest-Version, Created-By, Multi-Release, Built-By
• Main-class – точка входа приложения
• Classpath приложения
• Информация об экстеншне (Specification и Implementation, deprecated)
• Заголовки OSGI бандла
• Типы и хэши файлов архива (особенно применимо в Android приложениях)
Полный список стандартных заголовков можно почитать в документации.
Чтение атрибутов из MANIFEST.MF
При компиляции Java приложения вписываются данные в MANIFEST.MF файл которые потом должны использоваться при запуске приложения. Манифест файл содержит всё необходимое после компиляции. Часть кода из Ant скрипта:
Содержимое манифеста после компиляции:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.10.1 Created-By: 1.8.0_151-b12 (Oracle Corporation) Built-By: Rootware Built-Date: 2018-09-21 21:59:11 Implementation-Version: 1.0.0.0 Implementation-URL: http://example.com/ Main-Class: src.app.MyApp Class-Path: ../libs/c3p0-0.9.6-pre1.jar ../libs/json-simple-1.1.1.jar ../libs/mchange-commons-java-0.2.12.jar ../libs/mysql-connector-java- 5.1.46.jar
Код Java для чтения атрибутов:
private static void getBuildDate() < try (InputStream stream = MyApp.class.getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF")) < final Manifest manifest = new Manifest(); manifest.read(stream); final Attributes attributes = manifest.getMainAttributes(); if (attributes.getValue("Built-Date") != null) BUILD_DATE = attributes.getValue("Built-Date"); else _log.info("Null attribute."); >catch (Exception e) < e.printStackTrace(); >>
При чтении атрибута Built-Date всегда null. Подскажите, что я делаю не так при чтении манифеста? Если попытаться читать Implementation-Version, то выводится 0.9.6-pre1 версия первой библиотеки указанной в списке библиотек из Class-Path списка.
Понимание файла манифеста JAR
Архив Java (JAR) описывается его файлом манифеста. В этой статье рассматриваются его многочисленные возможности, в том числе добавление атрибуции, создание исполняемого файла JAR и встраивание информации о версиях.
Однако давайте начнем с краткого обзора того, что такое файл манифеста.
2. Файл манифеста
Файл манифеста называется MANIFEST.MF и находится в каталоге META-INF в JAR. Это просто список пар ключ-значение, называемый заголовками или атрибутами , сгруппированный в разделы.
Эти заголовки предоставляют метаданные, которые помогают нам описывать аспекты нашего JAR, такие как версии пакетов, какой класс приложения выполнять, путь к классам, материал подписи и многое другое.
3. Добавление файла манифеста
3.1. Манифест по умолчанию
Файл манифеста добавляется автоматически всякий раз, когда мы создаем JAR .
Например, если мы создадим JAR в OpenJDK 11:
jar cf MyJar.jar classes/
Он создает очень простой файл манифеста:
Manifest-Version: 1.0 Created-By: 11.0.3 (AdoptOpenJDK)
3.2. Пользовательский манифест
Или мы можем указать наш собственный файл манифеста.
Например, предположим, что у нас есть пользовательский файл манифеста с именем manifest.txt :
Built-By: foreach
Мы можем включить этот файл, и jar объединит его с файлом манифеста по умолчанию, когда мы используем параметр m :
jar cfm MyJar.jar manifest.txt classes/
Затем результирующий файл манифеста:
Manifest-Version: 1.0 Built-By: foreach Created-By: 11.0.3 (AdoptOpenJDK)
3.3. Мавен
Теперь содержимое файла манифеста по умолчанию меняется в зависимости от того, какие инструменты мы используем.
Например, Maven добавляет несколько дополнительных заголовков:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven 3.3.9 Built-By: foreach Build-Jdk: 11.0.3
На самом деле мы можем настроить эти заголовки в нашем файле pom.
Скажем, например, что мы хотим указать, кем был создан JAR и пакет:
plugin> groupId>org.apache.maven.pluginsgroupId> artifactId>maven-jar-pluginartifactId> version>3.1.2version> configuration> archive> manifest> packageName>com.foreach.javapackageName> manifest> manifestEntries> Created-By>foreachCreated-By> manifestEntries> archive> configuration> plugin>
Это создает файл манифеста с пользовательским пакетом и заголовками , созданными :
Manifest-Version: 1.0 Build-Jdk-Spec: 11 Package: com.foreach.java Created-By: foreach
4. Заголовки
Заголовок должен соответствовать определенному формату и отделяться новой строкой:
key1: value1 Key2: value2
Действительный заголовок должен иметь пробел между двоеточием и значением . Еще один важный момент — в конце файла должна быть новая строка . В противном случае последний заголовок игнорируется.
Давайте рассмотрим некоторые стандартные заголовки из спецификации и некоторые распространенные настраиваемые заголовки.
4.1. Основные заголовки
Основные заголовки обычно содержат общую информацию:
- Manifest-Version : версия спецификации.
- Created-By : версия инструмента и поставщик, создавший файл манифеста.
- Multi-Release : если true , то это Multi-Release Jar
- Built-By : этот настраиваемый заголовок содержит имя пользователя, создавшего файл манифеста.
4.2. Точка входа и путь к классам
Если наш JAR содержит работающее приложение, мы можем указать точку входа. Точно так же мы можем указать путь к классам . Поступая таким образом, мы избегаем необходимости указывать его, когда хотим его запустить.
- Main-Class : пакет и имя класса с основным методом (без расширения .class)
- Class-Path : разделенный пробелами список относительных путей к библиотекам или ресурсам.
Например, если наша точка входа в приложение находится в Application.class и использует библиотеки и ресурсы, мы можем добавить необходимые заголовки:
Main-Class: com.foreach.Application Class-Path: core.jar lib/ properties/
Путь к классам включает core.jar и все файлы в каталогах lib и properties . Эти активы загружаются относительно места выполнения JAR, а не из самого JAR . Другими словами, они должны существовать вне JAR.
4.3. Версия упаковки и запечатывание
Эти стандартные заголовки описывают пакеты в JAR.
- Название : пакет
- Реализация-Build-Date : дата сборки реализации.
- Реализация-название : название реализации
- Реализация- вендор : поставщик реализации
- Реализация-Версия : версия реализации
- Specification-Title : название спецификации.
- Specification-Vendor : поставщик спецификации
- Версия спецификации: версия спецификации
- Sealed : если true, то все классы для пакета взяты из одного и того же JAR (по умолчанию false)
Например, мы находим эти заголовки манифеста в драйвере MySQL Connector/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 цифровой подписью, чтобы добавить дополнительную безопасность и проверку. Хотя этот процесс выходит за рамки данной статьи, он добавляет в файл манифеста стандартные заголовки, показывающие каждый подписанный класс и его закодированную подпись . Дополнительные сведения см. в документации по подписанию JAR .
4.5. ОСГИ
Обычно также можно увидеть пользовательские заголовки для пакетов OSGI:
- Название пакета : название
- Bundle-SymbolicName : уникальный идентификатор
- Bundle-Version : версия
- Import-Package : пакеты и версии, от которых зависит пакет.
- Export-Package : набор пакетов и версий, доступных для использования.
См. нашу статью «Введение в OSGI », чтобы узнать больше о пакетах OSGI.
5. Разделы
В файле манифеста есть два типа разделов: основной и для каждой записи. Заголовки, которые появляются в основном разделе, применяются ко всему в JAR . Принимая во внимание , что заголовки, которые появляются в разделах для каждой записи, относятся только к именованному пакету или классу .
Кроме того, заголовок, появляющийся в разделе для каждой записи, переопределяет тот же заголовок в основном разделе. Разделы для каждой записи обычно содержат информацию о версиях пакетов и пломбировании, а также цифровую подпись.
Давайте рассмотрим простой пример раздела для каждой записи:
Implementation-Title: foreach-examples Implementation-Version: 1.0.1 Implementation-Vendor: ForEach Sealed: true Name: com/foreach/utils/ Sealed: false
Основной раздел вверху запечатал все пакеты в нашем JAR. Однако пакет com.foreach.utils распечатывается разделом для каждой записи.
6. Заключение
В этой статье представлен обзор того, как добавить файл манифеста в JAR, как использовать разделы и некоторые общие заголовки. Структура файла манифеста позволяет нам предоставлять стандартную информацию, такую как информация о версии.
Однако его гибкость позволяет нам определять любую информацию, которую мы считаем уместной для описания содержимого наших JAR-файлов.