Я помітив, що файли JAR, WAR та EAR містять MANIFEST.MF
файл під META-INF
папкою.
Яка користь від MANIFEST.MF
файлу? Що все можна вказати у цьому файлі?
Я помітив, що файли JAR, WAR та EAR містять MANIFEST.MF
файл під META-INF
папкою.
Яка користь від MANIFEST.MF
файлу? Що все можна вказати у цьому файлі?
Відповіді:
Зміст файла Manifest у файлі JAR, створеному з версією 1.0 Java Development Kit, є таким.
Manifest-Version: 1.0
Усі записи є парами імені-значення. Назва заголовка відокремлюється від його значення двокрапкою. Маніфест за замовчуванням показує, що він відповідає версії 1.0 специфікації маніфесту. Маніфест також може містити інформацію про інші файли, які упаковані в архів. Точно, яка інформація про файл записана в маніфесті, буде залежати від призначення, призначеного для файлу JAR. Файл маніфесту за замовчуванням не робить припущень щодо того, яку інформацію він повинен записувати про інші файли, тому його рядок містить дані лише про нього самого. Спеціальні заголовки маніфесту
Залежно від передбачуваної ролі файлу JAR, маніфест за замовчуванням, можливо, доведеться змінити. Якщо файл JAR створюється лише з метою архівування, файл MANIFEST.MF не має жодної цілі. Більшість використання файлів JAR виходять за рамки простого архівування та стиснення і вимагають наявності спеціальної інформації у файлі маніфесту. Нижче наведено короткі описи заголовків, необхідних для деяких спеціальних функцій JAR-файлів
Програми, що входять до складу файлів JAR: Якщо програма входить до складу файлу JAR, віртуальній машині Java потрібно повідомити, якою є точка входу до програми. Точка входу - це будь-який клас із загальнодоступним статичним методом void main (String [] args). Ця інформація міститься в заголовку Main-Class, який має загальну форму:
Main-Class: classname
Значення класу name має бути замінено на точку входу програми.
Розширення для завантаження: Розширення для завантаження - це файли 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, за яким слідує Запечатаний заголовок, подібний до цього:
Name: myCompany/myPackage/
Sealed: true
Значення заголовка Name - це відносна назва шляху пакунка. Зверніть увагу, що він закінчується на '/', щоб відрізнити його від імені файлу. Будь-які заголовки, що слідують за заголовком Name, без будь-яких проміжних порожніх рядків, застосовуються до файлу або пакету, зазначеного в заголовку Name. У наведеному вище прикладі, оскільки запечатаний заголовок виникає після заголовка Name: myCompany / myPackage, без порожніх рядків між ними, запечатаний заголовок буде інтерпретовано як застосовний (лише) до пакета 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."
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 програми. Це можна зробити, вказавши їх повністю кваліфіковані шляхи у файлі маніфесту за допомогою заголовка 'Class-Path',
Шлях до класу: {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 /} Запечатано: true
Тут назва пакета має закінчуватися на '/'.
Підвищення безпеки за допомогою файлів маніфесту:
Ми можемо використовувати записи файлів маніфестів, щоб забезпечити безпеку веб-програми або пакета аплетів з різними атрибутами, такими як "Дозволи", "Codebae", "Ім'я програми", "Тільки для довіри" та багато іншого.
Папка META-INF:
У цій папці знаходиться файл маніфесту. Крім того, він може містити більше файлів, що містять метадані про програму. Наприклад, у файлі JAR модуля EJB ця папка містить дескриптор розгортання EJB для модуля EJB разом із файлом маніфесту для JAR. Також він містить файл xml, що містить зіставлення абстрактних посилань EJB на конкретні ресурси контейнера сервера додатків, на якому він буде запущений.
Посилання:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html