Яке призначення META-INF?


Відповіді:


65

Взагалі кажучи, ви нічого не повинні вводити в META-INF. Натомість вам слід покластися на все, що ви використовуєте для упаковки свого JAR. Це одна з областей, на якій я думаю, що Ant дійсно перевершує: вказівку атрибутів явного файлу JAR. Дуже легко сказати щось на кшталт:

<jar ...>
    <manifest>
        <attribute name="Main-Class" value="MyApplication"/>
    </manifest>
</jar>

Принаймні, я думаю, що це просто ... :-)

Справа в тому, що META-INF слід вважати внутрішнім мета- каталогом Java . Не возиться з цим! Будь-які файли, які ви хочете включити до свого JAR, слід розмістити в іншому під-каталозі або в корені самого JAR.


17
А як щодо послуг? Дескриптори бібліотеки тегів? Вкладати щось у корінь JAR - це погана ідея. За відсутності чіткої конвенції, ресурси в корені занадто ймовірні для зіткнення.
erickson

13
Якщо ви використовуєте JPA, тоді ви повинні помістити persistent.xml у цю папку, це щось не відбувається автоматично.
JRSofty

4
Це було б гарною відповіддю, за винятком того, що в простому додатку Spring MVC META-INF - єдиний каталог, де на файли конфігурації можна посилатися як за допомогою тестів, так і для контролерів. Якщо інший каталог працював, це було б чудово - це не (принаймні, не прямо). Для мене побудова файлу Jar просто для перевірки файлу війни - це як побудова машини, щоб ви могли піти на кухню. Принаймні мені. Але я провів деякий час, роблячи Ruby, і вони, можливо, зіпсували мене, що стосується файлів конфігурації (хоча я торгую невеликим пекло XML, щоб знати, які типи моїх параметрів). :)
Джон Локвуд

Чи можете ви навести якийсь приклад про типи файлів, які мають містити цю папку?
Менай Ала Еддін - Аладдін

3
Це не відповідає, що таке META-INF. Якби у мене була відповідь на це, то, можливо, я міг би судити про те, чи потрібно ніколи не вносити щось у цю папку чи ні.
Kröw

164

З офіційної специфікації файлу JAR (посилання переходить до версії Java 7, але текст не змінювався щонайменше v1.3):

Каталог META-INF

Наступні файли / каталоги в каталозі META-INF розпізнаються та інтерпретуються платформою Java 2 для налаштування програм, розширень, навантажувачів класів та служб:

  • MANIFEST.MF

Файл маніфесту, який використовується для визначення даних про розширення та пакети.

  • INDEX.LIST

Цей файл генерується новою -iопцією інструменту jar, яка "" містить інформацію про місцезнаходження для пакетів, визначених у програмі чи розширенні. Він є частиною реалізації JarIndex і використовується навантажувачами класів для прискорення процесу завантаження класів.

  • x.SF

Файл підпису для файлу JAR. 'x' позначає ім'я базового файлу.

  • x.DSA

Файл блоку підписів, пов'язаний з файлом підпису з тим самим базовим файлом. Цей файл зберігає цифровий підпис відповідного файла підпису.

  • services/

У цьому каталозі зберігаються всі файли конфігурації постачальника послуг.


3
TLD також повинні відповідати META-INF.
erickson

@erickson, Elaborate?
Pacerier

Дескриптори бібліотеки тегів @Pacerier для бібліотек тегів JSP повинні знаходитися в каталозі META-INF. Я забув, на чому стояв TLD у 2008 році
erickson

27

Я помітив, що деякі бібліотеки Java почали використовувати META-INF як каталог, в який включати файли конфігурації, які повинні бути упаковані та включені в CLASSPATH разом з JAR. Наприклад, Spring дозволяє імпортувати XML-файли, які перебувають на шляху до класу за допомогою:

<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />

У цьому прикладі я цитую прямо з Посібника користувача Apache CXF . У проекті, над яким я працював, в якому нам довелося дозволити декілька рівнів конфігурації через Spring, ми дотримувалися цієї конвенції і помістили наші файли конфігурації в META-INF.

Коли я розмірковую над цим рішенням, я не знаю, що саме було б не так, просто включивши файли конфігурації в конкретний пакет Java, а не в META-INF. Але це, здається, є новим фактичним стандартом; або це, або новий анти-шаблон :-)


4
Конфігурація не належить до бібліотеки. Думаю, ви прибили це "новим анти-візерунком". Знайти конфігураційні файли відносно бібліотеки дуже просто; їм не потрібно фізично їхати в той же JAR, щоб його знайти.
erickson

24
Я не згоден із твердженням, що конфігурація не належить до бібліотеки. Я думаю, що конфігурація, особливо якщо мова йде про типові настройки, добре упакована в бібліотеку. Я насправді радий, що більше фреймворків вирішили працювати так, на відміну від того, щоб змусити вас включати всі види зовнішніх файлів конфігурації, як це було звичайно не так давно.
Eelco

1
Я бачив дуже багато файлів типу LICENSE.TXT, що відображаються і в META_INF, що мені дратує.
Ti Strga

@Eelco, Код та дані не повинні змішуватися. Включення зовнішніх файлів конфігурації не обов'язково означає безлад. Це залежить від того, як вона структурована.
Pacerier

1
Це досить довільна річ заявити @Pacerier. Як загальне твердження, це багато в чому перевагу.
Eelco

13

Папка META-INF - це головна для файлу MANIFEST.MF . Цей файл містить метадані про вміст JAR. Наприклад, є запис під назвою Main-Class, який визначає ім'я класу Java зі статичним main () для виконуваних файлів JAR.


10

Ви також можете розмістити там статичні ресурси.

Наприклад:

META-INF/resources/button.jpg 

і отримати їх у web3.0-контейнер через

http://localhost/myapp/button.jpg

> Детальніше

/META-INF/MANIFEST.MF має особливе значення:

  1. Якщо ви запускаєте банку за допомогою, java -jar myjar.jar org.myserver.MyMainClassви можете перемістити визначення основного класу в банку, щоб ви могли зменшити виклик java -jar myjar.jar.
  2. Ви можете визначити Metainformations для пакетів, якщо ви використовуєте java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Ви можете посилатися на цифрові сертифікати, якими ви хочете користуватися в режимі Applet / Webstart.

Отже, будь-які статичні матеріали в додатку повинні бути розміщені в цьому каталозі, як зображення чи інші матеріали.
Менай Ала Еддін - Аладдін

6

META-INF в м. Мавен

У Maven папка META-INF розуміється через стандартний макет каталогів , який за конвенцією імен пакує ваші ресурси проекту в межах JAR: будь-які каталоги або файли, розміщені в каталозі $ {basedir} / src / main / ресурси , пакуються у ваш JAR з точно такою ж структурою, що починається в основі JAR. Папка $ {basedir} / src / main / ресурси / META-INF зазвичай містить файли .properties, тоді як в банку міститься створене MANIFEST.MF , pom.properties , pom.xml , серед інших файлів. Також такі структури, як Spring, використовуються classpath:/META-INF/resources/для обслуговування веб-ресурсів. Для отримання додаткової інформації дивЯк додати ресурси до свого проекту Maven .


5

Просто для додання тут інформації, у випадку файлу WAR, файл META-INF / MANIFEST.MF надає розробнику можливість ініціювати перевірку часу розгортання контейнером, що гарантує, що контейнер може знайти всі класи вашої програми залежить від. Це гарантує, що у випадку, якщо ви пропустили JAR, вам не доведеться чекати, поки ваша програма почне виконуватись, щоб зрозуміти, що вона відсутня.


5

Я недавно думав над цим питанням. Звичайно, не існує обмежень щодо використання META-INF. Звичайно, існують певні суворі вимоги щодо необхідності розміщення маніфесту, але, як видається, немає ніяких заборон щодо розміщення інших матеріалів.

Чому це так?

Справа cxf може бути законною. Ось ще одне місце, де цей нестандартний рекомендується обійти неприємну помилку в JBoss-ws, яка перешкоджає валідації на стороні сервера щодо схеми wsdl.

http://community.jboss.org/message/570377#570377

Але насправді, здається, немає жодних стандартів, будь-яких тисячоліть. Зазвичай ці речі дуже чітко визначені, але чомусь, здається, тут немає стандартів. Незвичайно. Схоже, що META-INF став місцем вибору для будь-якої необхідної конфігурації, яку неможливо легко обробити іншим способом.


5

Додаючи сюди інформацію, META-INF - це спеціальна папка, яка ClassLoaderрозглядає інакше, ніж інші папки в банку. Елементи, вкладені всередині папки META-INF, не змішуються з елементами поза нею.

Подумайте про це як про інший корінь. З Enumerator<URL> ClassLoader#getSystemResources(String path)точки зору методу та інших:

Коли даний шлях починається з "META-INF", метод здійснює пошук ресурсів, які вкладені всередині папок META-INF у всіх банках шляху до класу.

Коли даний шлях не починається з "META-INF", метод шукає ресурси у всіх інших папках (за межами META-INF) усіх банок та каталогів у шляху до класу.

Якщо ви знаєте про інше ім'я папки, яке getSystemResourcesметод спеціально стосується, будь ласка, прокоментуйте це.


3

Якщо ви використовуєте JPA1, можливо, вам доведеться занести persistence.xmlфайл, який вказує ім'я постійної одиниці, яку ви можете використовувати. Блок стійкості забезпечує зручний спосіб визначення набору файлів метаданих, класів та банок, які містять усі класи, які слід зберігати в групуванні.

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Детальніше дивіться тут: http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

Усі відповіді правильні. Мета-інф має багато цілей. Крім того, ось приклад використання контейнера tomcat.

Перейдіть у Tomcat Doc і перевірте атрибут " Стандартна реалізація> copyXML ".

Опис нижче.

Установіть значення true, якщо ви хочете, щоб контекстний дескриптор XML, вбудований всередину програми (розташований за адресою /META-INF/context.xml), був скопійований у власний xmlBase хоста при розгортанні програми. При наступних запусках скопійований дескриптор XML контексту буде використовуватися в перевазі будь-якого контекстного дескриптора XML, вбудованого всередину програми, навіть якщо дескриптор, вбудований всередину програми, більш сучасний. Значення прапора за замовчуванням відповідає значенням false. Зверніть увагу, якщо атрибут розміщенняXML власного хоста хибний або якщо атрибут copyXML власного хоста є істинним, цей атрибут не матиме ефекту.


0

Ви маєте файл MANIFEST.MF у папці META-INF. Ви можете визначити факультативні або зовнішні залежності , до яких потрібно мати доступ.

Приклад:

Подумайте, що ви розгорнули додаток, і ваш контейнер (під час запуску) з’ясував, що для вашої програми потрібна нова версія бібліотеки, яка не знаходиться в папці lib, у цьому випадку, якщо ви визначили необов’язковішу нову версію, MANIFEST.MFтоді ваш додаток буде посилатися до залежності відвідти (і не впаде).

Source: Головний перший Jsp & Servlet


1
Незрозуміло, скільки цього цитується з джерела, і це не виглядає дослівно. Видалено химерне форматування. Не використовуйте форматування коду для тексту, який не є кодом. Використовуйте форматування цитат для тексту, який цитується.
Маркіз Лорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.