Что находится внутри файла манифест java
Всякий раз, когда разработчик хочет распространять версию своего программного обеспечения, ему нужно только распространять один файл, а не структуру каталогов, заполненную файлами классов. JAR-файлы были разработаны для этой цели. Файл JAR может содержать как файлы классов, так и файлы других типов, например файлы звука и изображения, которые могут быть включены в проект. Все файлы в JAR-файле сжимаются в формате, подобном zip.
Создание файла JAR — дополнительные параметры
Файл JAR создается с помощью инструмента JAR. Общая команда выглядит примерно так:
- jar-file: имя файла jar, в котором вы хотите использовать инструмент jar.
- file1, file2, file3: файлы, которые вы хотите добавить в файл jar. manifest-file — это имя файла, который содержит манифест этого jar-файла, указывать манифест-файл в качестве аргумента совершенно необязательно.
- c : создает новый или пустой архив и добавляет в него файлы. Если какое-либо из указанных имен файлов является каталогами, то программа jar обрабатывает их рекурсивно.
- C : временно меняет каталог.
- e: создает точку входа в манифест.
- f : указывает имя файла JAR в качестве второго аргумента командной строки. Если этот параметр отсутствует, jar запишет результат в стандартный вывод (при создании файла JAR) или прочитает его из стандартного ввода (при извлечении или табулировании файла JAR).
- я : создает индексный файл.
- m : добавляет файл манифеста в файл JAR. Манифест — это описание содержимого архива и его происхождения. Каждый архив имеет манифест по умолчанию, но вы можете указать свой собственный, если хотите аутентифицировать содержимое архива.
- М : Не создает файл манифеста для записей.
- t: отображение оглавления.
- u: обновляет существующий файл JAR.
- v: генерирует подробный вывод.
- x: извлечь файлы Если вы указываете одно или несколько имен файлов, извлекаются только эти файлы. В противном случае все файлы извлекаются.
- 0: магазины без сжатия zip.
Параметры команды jar почти аналогичны параметрам команды tar в UNIX. В окнах вы также можете получить справку о различных параметрах команды jar, просто набрав jar в cmd и нажав Enter, результат будет примерно таким:
Для создания файла JAR с двумя классами server.class и client.class и Jpeg image logo.jpg необходимо написать следующую команду:
Вывод вышеуказанной команды будет выглядеть примерно так:
Лучше использовать опцию -v вместе с командой jar, чтобы узнать, как идут дела.
Файл манифеста
Каждый файл JAR содержит файл манифеста, который описывает функции архива. Каждый JAR-файл имеет файл манифеста по умолчанию. Файл манифеста по умолчанию называется MANIFEST.MF и присутствует в подкаталоге META-INF архива. Хотя файл манифеста по умолчанию содержит только две записи, но у сложных файлов манифеста может быть намного больше. Вот как выглядит файл манифеста по умолчанию:
Что нужно иметь в виду при работе с файлами манифеста:
- Вы должны оставить пробел между именем и значением любого раздела в файле манифеста, например, версия: 1.1 находится в допустимом разделе, вместо этого напишите версию: 1.1, что пробел между двоеточием и 1.1 действительно имеет большое значение.
- При указании основного класса не следует добавлять расширение .class в конце имени класса. Просто укажите основной класс, набрав:
(Очень скоро я расскажу о секции Main-Class).
Пример:
Теперь вернемся и обновим содержимое нашего архива chat.jar. Чтобы обновить файл манифеста, нам просто нужно написать следующую команду:
Здесь manifest.txt — это новый файл манифеста, который имеет следующее содержимое:
Вывод вышеуказанной команды будет выглядеть примерно так:
Здесь мы получаем два предупреждения, потому что мы пытаемся перезаписать ранее представленные записи.
Исполняемые файлы Jar
Вы можете использовать опцию e команды jar, чтобы указать точку входа в вашу программу, т.е. класс, который вы обычно хотите вызывать при запуске вашего Java-приложения.
Пример:
Чтобы создать файл chat.jar с классом клиента в качестве основного, необходимо написать следующую команду —
Вывод вышеуказанной команды будет выглядеть примерно так:
Не забудьте не добавлять расширение .class после имени класса, который вы хотите установить основным классом.
В качестве альтернативы вы можете добавить запись Main-Class в файл манифеста, а затем обновить ее. Для приведенного выше примера вам просто нужно добавить эту запись:
Когда основной класс установлен, можно просто запустить jar-программу, написав следующую команду:
В зависимости от конфигурации операционной системы пользователи могут даже запустить приложение, дважды щелкнув значок файла JAR.
Запечатывание пакета
Наконец, мы собираемся обсудить герметизацию пакетов в Java. Мы можем запечатать пакет в Java, чтобы другие классы не могли добавить себя в него. Возможно, вы захотите запечатать пакет, если вы используете в коде видимые классы, методы и поля. Без запечатывания упаковки другие классы могут добавлять себя в ту же упаковку и, таким образом, получать доступ к видимым функциям упаковки.
- Для обеспечения герметизации пакета все, что нужно сделать, это поместить все классы этого пакета в файл JAR.
- По умолчанию пакеты в файле jar не запечатаны, но можно изменить глобальное значение по умолчанию, добавив несколько строк в файл манифеста.
- Давайте снова рассмотрим случай нашего архива chat.jar, теперь пакет классов client.class и server.class является приложением, и мы хотим запечатать этот пакет, все, что нам нужно сделать, это добавить следующую строку в файл манифеста и обновить его ,
Это все с моей стороны о том, как работать с файлами JAR. Будьте на связи!!
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Обычно удобно объединять множество файлов классов Java в один архивный файл.
В этом уроке мы рассмотрим все тонкости работы с jar – или J ava AR chive – файлами на Java.
В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar. Мы также ответим на некоторые любопытные вопросы, такие как как легко прочитать файл манифеста jar по пути.
4. Использование Maven
3.5. Подробный Вывод
Если нам нужна дополнительная информация из команды jar , мы можем просто добавить опцию v для verbose.
Давайте запустим нашу команду jar с параметром v :
6. Заключение
В этой статье представлен обзор того, как добавить файл манифеста в JAR, как использовать разделы и некоторые общие заголовки. Структура файла манифеста позволяет нам предоставлять стандартную информацию, такую как информация о версии.
Однако его гибкость позволяет нам определять любую информацию, которую мы считаем уместной для описания содержимого наших банок.
Каждое приложение содержит файл манифеста AndroidManifest.xml . Данный файл определяет важную информацию о приложении - название, версию, иконки, какие разрешения приложение использует, регистрирует все используемые классы activity, сервисы и т.д. Данный файл можно найти в проекте в папке manifests :
Файл манифеста может выглядеть так:
Элементом корневого уровня является узел manifest . В данном случае только определяется пакет приложения - package="com.example.viewapp" . Собственно это определение файла манифеста по умолчанию. В каждом конкретном случае может отличаться пакет приложения, остальное содержимое при создании проекта с пустой activity будет аналогичным.
Большинство настроек уровня приложения определяются элементом application . Ряд настроек задаются с помощью атрибутов. По умолчанию применяются следующие атрибуты:
android:allowBackup указывает, будет ли для приложения создаваться резервная копия. Значение android:allowBackup="true" разрешает создание резервной копии.
android:icon устанавливает иконку приложения. При значении android:icon="@mipmap/ic_launcher" иконка приложения берется из каталога res/mipmap
android:roundIcon устанавливает круглую иконку приложения. Также берется из каталога res/mipmap
android:label задает название приложение, которое будет отображаться на мобильном устройстве в списке приложений и в заголовке. В данном случае оно хранится в строковых ресурсах - android:label="@string/app_name" .
android:supportsRtl указывает, могут ли использоваться различные RTL API - специальные API для работы с правосторонней ориентацией текста (например, для таких языков как арабский или фарси).
android:theme устанавливает тему приложения. Подробно темы будут рассмотрены далее, а пока достаточно знать, что тема определяет общий стиль приложения. Значение @style/Theme.ViewApp" берет тему "Theme.ViewApp" из каталога res/values/themes
Вложенные элементы activity определяют все используемые в приложении activity. В данном случае видно, что в приложении есть только одна activity - MainActivity.
Элемент intent-filter в MainActivity указывает, как данная activity будет использоваться. В частности, с помощью узла action android:name="android.intent.action.MAIN" , что данная activity будет входной точкой в приложение и не должна получать какие-либо данные извне.
Элемент category android:name="android.intent.category.LAUNCHER" указывает, что MainActivity будет представлять стартовый экран, который отображается при запуске приложения.
Файл манифеста может содержать множество элементов, которые имеют множество атрибутов. И все возможные элементы и их атрибуты можно найти в документации. Здесь же рассмотрим некоторые примеры использования.
6.4. Просмотр файла манифеста
Поскольку может быть важно знать, что находится в нашем файле MANIFEST.MF , давайте рассмотрим быстрый и простой способ заглянуть в содержимое, не выходя из командной строки.
Давайте воспользуемся командой unzip с параметром-p:
4.3. Версия упаковки и герметизация
Эти стандартные заголовки описывают пакеты в банке.
- Имя : пакет
- Реализация-Дата сборки : дата сборки для реализации
- Реализация-Название : название реализации
- Реализация-Поставщик : поставщик для реализации
- Версия реализации : версия реализации
- Спецификация-Заголовок : заголовок спецификации
- Спецификация-Поставщик : поставщик для спецификации
- Спецификация-Версия : версия спецификации
- Sealed : если true, то все классы для пакета исходят из одной и той же банки (по умолчанию false)
Например, мы находим эти заголовки манифеста в соединителе драйверов MySQL/J JAR . Они описывают версию спецификации JDBC, которой соответствует JAR, а также версию самого драйвера:
4.1. Конфигурация по Умолчанию
Мы также можем использовать Maven для создания нашей банки. Поскольку Maven предпочитает условность конфигурации, мы можем просто запустить пакет для создания нашего jar-файла.
По умолчанию наш jar-файл будет добавлен в папку target в нашем проекте.
3.1. Манифест по Умолчанию
Файл манифеста добавляется автоматически всякий раз, когда мы создаем банку .
Например, если мы создадим JAR в OpenJDK 11:
Он создает очень простой файл манифеста:
6. Запуск банки
Теперь, когда у нас есть файл jar, мы можем его запустить. Мы запускаем jar – файлы с помощью команды java .
Установка разрешений
Иногда приложению требуются разрешения на доступ к определенным ресурсам, например, к списку контактов, камере и т.д. Чтобы приложение могло работать с тем же списком контактов, в файле манифесте необходимо установить соответствующие разрешения. Для установки разрешений применяется элемент :
Атрибут android:name устанавливает название разрешения: в данном случае на чтение списка контактов и использование камеры. Опционально можно установить максимальную версию sdk посредством атрибута android:maxSdkVersion , который принимает номер API.
6.2. Указание основного класса
Мы также можем указать основной класс, когда мы запускаем наше приложение. Мы можем использовать опцию -cp , чтобы убедиться, что наш jar-файл находится в пути к классу, а затем предоставить ваш основной класс в формате package.className :
Использование разделителей путей вместо формата пакета также работает:
3.3. Обновление содержания
Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.
Давайте используем команду jar с параметром u для обновления ее содержимого:
2. Настройка программы Java
Прежде чем мы сможем создать запускаемый jar-файл, наше приложение должно иметь класс с основным методом . Этот класс обеспечивает нашу точку входа в приложение:
5.2. Установка точки входа
Установка нашего основного класса-это то, где мы находим различия между созданием jar с обычным Java-приложением и fat jar для приложения Spring Boot . В приложении Spring Boot основной класс на самом деле является org.springframework.boot.loader.Ярлаунчер .
Хотя наш пример не является приложением Spring Boot, мы могли бы легко настроить его как консольное приложение Spring Boot .
Наш основной класс должен быть указан как начальный класс:
Мы также можем использовать Gradle для создания Spring Boot fat jar .
4.4. Подписанная банка
Мы можем подписать вашу банку цифровой подписью, чтобы добавить дополнительную безопасность и проверку. Хотя этот процесс выходит за рамки данной статьи, при этом в файл манифеста добавляются стандартные заголовки, показывающие каждый подписанный класс и его закодированную подпись . Пожалуйста, ознакомьтесь с документацией JAR signing для получения более подробной информации.
5. Разделы
В файле манифеста есть два типа разделов: основной и для каждой записи. Заголовки, которые появляются в главном разделе, применяются ко всему, что находится в БАНКЕ . В то время как заголовки , которые появляются в разделах для каждой записи, применяются только к именованному пакету или классу .
Кроме того, заголовок, появляющийся в разделе для каждой записи, переопределяет тот же заголовок в основном разделе. Обычно разделы для каждой записи содержат информацию о версиях пакетов и печати, а также цифровую подпись.
Давайте рассмотрим простой пример раздела для каждой записи:
Основная секция в верхней части запечатала все пакеты в нашей БАНКЕ. Тем не менее, пакет com.baeldung.utils не запечатан разделом для каждой записи.
5.1. Использование Maven и Defaults
Если мы используем Spring Boot с Maven, мы должны сначала подтвердить, что наш параметр упаковки установлен в jar , а не war в нашем pom.xml файл.
Как только мы узнаем, что это настроено, мы можем запустить пакет цель:
3.2. Установка основного класса
Полезно, чтобы манифест файла jar включал основной класс.
Манифест-это специальный файл в банке, расположенный в каталоге META-INF и названный MANIFEST.MF . Файл манифеста содержит специальную метаинформацию о файлах в файле jar.
Некоторые примеры того, для чего мы можем использовать файл манифеста, включают установку точки входа, установку информации о версии и настройку пути к классу.
Используя опцию e , мы можем указать нашу точку входа, и команда jar добавит ее в сгенерированный файл манифеста.
Давайте запустим jar с указанной точкой входа:
1. введение
Архив Java (JAR) описывается файлом манифеста. В этой статье рассматриваются его многочисленные возможности, включая добавление атрибуции, создание исполняемого файла JAR и встраивание информации об управлении версиями.
Однако давайте начнем с краткого обзора того, что такое файл манифеста.
Запрет на изменение ориентации
Приложение в зависимости от положения гаджета может находиться в альбомной и портретной ориентации. Не всегда это бывает удобно. Мы можем сделать, чтобы приложение вне зависимости от поворота гаджета использовало только одну ориентацию. Для этого в файле манифеста у требуемой activity надо установить атрибут android:screenOrientation . Например, запретим альбомную ориентацию:
Значение android:screenOrientation="portrait" указывает, что данная activity будет находиться только в портретной ориентации. Если же надо установить только альбомную ориентацию, тогда надо использовать значение android:screenOrientation="landscape"
Манифест – это файл с расширением MF, который создаётся всегда, когда формируется Jar файл (за исключением случая, когда в команде на создание Jar файла указана опция M, не спутайте её с опцией m). Этот создаваемый Jar инструментами манифест назовём манифестом по умолчанию (default manifest). Каждая строка файла манифеста – разделённая двоеточием пара “имя: значение”. Содержание манифеста по умолчанию можно изменить следующим образом. В папке bin нашего проекта создайте текстовый файл MANIFEST.txt, получим:
Введите текст в MANIFEST.txt:
и переведите курсор на новую строку, это важно:
Обратите внимание, на картинке курсор в начале новой строки. Сохраните текстовый файл MANIFEST.txt. В MANIFEST.txt мы объявили главный класс приложения. Наш класс находится в пакете myPack, это отражено в MANIFEST.txt: myPack.JarClass.
Ещё раз. Файл манифеста MANIFEST.MF автоматически создаётся всегда (если нет M в команде). Тогда для чего мы создали ещё какой-то MANIFEST.txt? Для того, чтобы изменить содержание дефолтного манифеста, т.е. MANIFEST.MF. При создании файла Jar строки из нашего MANIFEST.txt добавятся в файл MANIFEST.MF.
Создание Jar файла
Правой кнопкой по значку MyJar.bat -> Изменить и вносим такой текст:
здесь m – указание на использование нашего текстового файла, а это MANIFEST.txt, для добавления информации в дефолтный манифест;
JARFile.jar – jar файл, который мы создаём;
MANIFEST.txt – наш текстовый файл, который нужен для изменения дефолтного манифеста MANIFEST.MF;
myPack/*.class – указание архивировать все файлы с расширением class из пакета myPack.
Сохраните MyJar.bat. Теперь можно создать jar файл: два клика по MyJar.bat и через секунду получаем JarFile.jar:
Проверим работу полученного JarFile.jar: два раза кликаем по JarFile.jar и видим знакомое окно:
JarFile.jar можно скопировать и поместить копию в любой каталог – она будет работать.
Поддержка разных разрешений
Мир устройств Android очень сильно фрагментирован, здесь встречаются как гаджеты с небольшим экраном, так и большие широкоэкранные телевизоры. И бывают случаи, когда надо ограничить использование приложения для определенных разрешений экранов. Для этого в файле манифеста определяется элемент :
Данный элемент принимает четыре атрибута:
android:largeScreens - экраны с диагональю от 4.5 до 10"
android:normalScreens - экраны с диагональю от 3 до 4.5"
android:smallScreens - экраны с диагональю меньше 3"
android:xlargeScreens - экраны с диагональю больше 10"
Если атрибут имеет значение true , то приложение будет поддерживаться соответствующим размером экрана
5. Использование Пружинного Ботинка
4.2. Точка входа и Путь к классу
Если наш JAR содержит выполняемое приложение, мы можем указать точку входа. Аналогично, мы можем предоставить путь к классу . Поступая таким образом, мы избегаем необходимости указывать его, когда мы хотим его запустить.
- Main-Class : пакет и имя класса с основным методом (без расширения класса)
- Class-Path : разделенный пробелом список относительных путей к библиотекам или ресурсам
Например, если ваша точка входа в приложение находится в Application.class и он использует библиотеки и ресурсы, тогда мы можем добавить необходимые заголовки:
Путь к классу включает в себя core.jar и все файлы в каталогах lab и properties . Эти активы загружаются относительно того, где выполняется JAR, а не из самой JAR . Другими словами, они должны существовать вне БАНКИ.
3.1. Использование параметров по умолчанию
Чтобы создать файл jar, мы будем использовать кувшин команда.
Чтобы использовать команду jar для создания файла jar, нам нужно использовать опцию c , чтобы указать, что мы создаем файл, и опцию f , чтобы указать файл:
Определение версии
С помощью атрибутов элемента manifest можно определить версию приложения и его кода:
Атрибут android:versionName указывает на номер версии, который будет отображаться пользователю и на которую будут ориентироваться пользователи при работе с приложением.
Тогда как атрибут android:versionCode представляет номер версии для внутреннего использования. Этот номер только определяет, что одна версия приложения более новая, чем какая-то другая с меньшим номером номером версии. Этот номер не отображается пользователям.
При желании мы также можем определить версию в ресурсах, а здесь ссылаться на ресурс.
4.5. OSGI
Обычно также можно увидеть пользовательские заголовки для пакетов OSGI:
- Имя пакета : название
- Bundle-SymbolicName : уникальный идентификатор
- Bundle-Версия : версия
- Import-Package : пакеты и версии, от которых зависит комплект
- Export-Package : пакеты пакетов и версии, доступные для использования
См.нашу статью Введение в OSGI, чтобы узнать больше о пакетах OSGI.
7. Заключение
В этом уроке мы настроим простое Java-приложение с классом main .
Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar , с помощью Maven и с помощью приложения Maven Spring Boot.
После того, как мы создали наши jar-файлы, мы вернулись в командную строку и запустили их с выведенным и заданным основным классом.
Мы также узнали, как отображать содержимое файла и как отображать содержимое одного файла в банке.
Узнайте о файле манифеста JAR, его возможностях и многом другом.
Установка версии SDK
Для управления версией android sdk в файле манифеста определяется элемент . Он может использовать следующие атрибуты:
minSdkVersion : минимальная поддерживаемая версия SDK
targetSdkVersion : оптимальная версия
maxSdkVersion : максимальная версия
Версия определяется номером API, например, Jelly Beans 4.1 имеет версию 16, а Android 11 имеет версию 30:
6.3. Перечисление содержимого банки
Мы можем использовать команду jar для перечисления содержимого нашего файла jar:
3.3. Maven
Теперь содержимое файла манифеста по умолчанию изменяется в зависимости от того, какие инструменты мы используем.
Например, Maven добавляет некоторые дополнительные заголовки:
Мы действительно можем настроить эти заголовки в нашем pom.
Скажем, например, что мы хотим указать, кем была создана банка и пакет:
При этом создается файл манифеста с пользовательскими заголовками package и created-by :
Полный список опций см. в документации по плагину Maven JAR .
4.1. Основные заголовки
Основные заголовки обычно содержат общую информацию:
- Manifest-Version : версия спецификации
- Created-By : версия инструмента и поставщик, создавшие файл манифеста
- Multi-Release : если true , то это Многоразрядная банка
- Встроенный : в этом пользовательском заголовке указывается имя пользователя, создавшего файл манифеста
3. Добавление файла манифеста
3.4. Настройка файла манифеста
В некоторых случаях нам может потребоваться больше контроля над тем, что входит в наш файл манифеста. Команда jar предоставляет функциональные возможности для предоставления нашей собственной информации о манифесте.
Давайте добавим частичный файл манифеста с именем example_manifest.txt чтобы ваше приложение установило нашу точку входа:
Информация о манифесте, которую мы предоставляем, будет добавлена к тому, что генерирует команда jar, так что это единственная строка, которая нам нужна в файле.
Важно, чтобы мы заканчивали наш файл манифеста символом |/newline . Без новой строки наш файл манифеста будет молча проигнорирован.
С этой настройкой давайте снова создадим нашу банку, используя нашу информацию о манифесте и опцию m :
2. Файл Манифеста
Файл манифеста называется MANIFEST.MF и находится в каталоге META-INF в JAR. Это просто список пар ключей и значений, называемых заголовками или атрибутами , сгруппированных в разделы.
Эти заголовки предоставляют метаданные, которые помогают нам описать аспекты нашей JAR, такие как версии пакетов, класс приложения для выполнения, путь к классу, материал подписи и многое другое.
6.1. Вывод основного класса
Поскольку мы пошли дальше и убедились, что наш основной класс указан в манифесте, мы можем использовать опцию -jar команды java для запуска нашего приложения без указания основного класса:
4. Заголовки
Заголовок должен соответствовать определенному формату и разделяться новой строкой:
Допустимый заголовок должен содержать пробел между двоеточием и значением . Еще один важный момент заключается в том, что в конце файла должна быть новая строка . В противном случае последний заголовок игнорируется.
Давайте рассмотрим некоторые стандартные заголовки из спецификации | и некоторые общие пользовательские заголовки.
4.2. Указание основного класса
Мы также можем настроить Maven для указания основного класса и создания исполняемого jar-файла .
3.2. Пользовательский Манифест
Или мы можем указать ваш собственный файл манифеста.
Например, предположим, что у нас есть пользовательский файл манифеста с именем manifest.txt :
Мы можем включить этот файл и jar объединит его с файлом манифеста по умолчанию при использовании опции m :
Затем результирующий файл манифеста:
3. Команда Jar
Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим наш jar-файл.
Мы можем сделать это с помощью javac из командной строки:
Команда javac создает JarExample.class в каталоге com/baeldung/jar . Теперь мы можем упаковать это в файл jar.
Читайте также: