Какова цель 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 - плохая идея. В отсутствие четкого соглашения ресурсы в корне слишком вероятно столкнутся.
Эриксон
13
Если вы используете JPA, вы должны поместить в эту папку файл persistence.xml, что не происходит автоматически.
JRSofty
4
Это был бы хороший ответ, за исключением того, что в простом приложении Spring MVC META-INF является единственным каталогом, на который можно ссылаться на файлы конфигурации как модульными тестами, так и контроллерами. Если бы другой каталог работал, это было бы здорово - это не так (по крайней мере, не просто). Для меня создание файла Jar просто для проверки файла войны - это все равно, что построить машину, чтобы вы могли идти на кухню. По крайней мере, для меня. Но я потратил некоторое время на работу с Ruby, и они, возможно, погубили меня настолько, насколько пошли файлы конфигурации (хотя я обменял небольшой ад на XML на знание типов моих параметров). :)
Джон Локвуд
Можете ли вы привести пример того, какие типы файлов должны содержать эту папку?
Менай Ала Эддин - Аладдин
3
Это не отвечает, что такое META-INF. Если бы у меня был ответ на этот вопрос, то, возможно, я мог бы судить, нужно ли «никогда» делать что-либо в этой папке, сам.
Крюв
164

Из официальной спецификации файла JAR (ссылка ведет на версию Java 7, но текст не изменился, по крайней мере, начиная с версии 1.3):

Каталог МЕТА-ИНФ

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

  • MANIFEST.MF

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

  • INDEX.LIST

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

  • x.SF

Файл подписи для файла JAR. «х» обозначает базовое имя файла.

  • x.DSA

Файл блока подписи, связанный с файлом сигнатуры с тем же базовым именем файла. В этом файле хранится цифровая подпись соответствующего файла подписи.

  • services/

В этом каталоге хранятся все файлы конфигурации поставщика услуг.

Ака
источник
3
ДВУ тоже должны входить в META-INF.
Эриксон
@erickson, разработать?
Пейсер
Дескрипторы библиотеки тегов @Pacerier для библиотек тегов JSP должны находиться в каталоге META-INF. Я забыл, что
означал
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. Но, похоже, это де-факто новый стандарт; или это, или появляющийся антипаттерн :-)

user38748
источник
4
Configuraton не принадлежит библиотеке. Я думаю, что ты прибил это с "появляющимся анти-образцом". Найти конфигурационные файлы относительно библиотеки довольно просто; им не нужно физически заходить в один и тот же JAR, чтобы быть найденным.
Эриксон
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. Если вы используете jar с помощью, java -jar myjar.jar org.myserver.MyMainClassвы можете переместить определение основного класса в jar, чтобы вы могли уменьшить вызов в java -jar myjar.jar.
  2. Вы можете определить метаинформацию для пакетов, если вы используете java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Вы можете ссылаться на цифровые сертификаты, которые вы хотели бы использовать в режиме апплета / веб-запуска.
зловещий
источник
Поэтому любые статические объекты в приложении должны быть помещены в этот каталог, например изображения или другие материалы.
Менай Ала Эддин - Аладдин
6

МЕТА-ИНФ в Maven

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

EliuX
источник
5

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

Sasuke
источник
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 всех jar-файлов в пути класса.

Когда данный путь не начинается с «META-INF», метод ищет ресурсы во всех других папках (кроме META-INF) всех jar-файлов и каталогов в пути к классам.

Если вы знаете о другом имени папки, которое getSystemResourcesметод обрабатывает специально, прокомментируйте это.

Readren
источник
3

Если вы используете JPA1, вам, возможно, придется добавить persistence.xmlтуда файл, в котором указано имя единицы сохраняемости, которую вы, возможно, захотите использовать. Модуль постоянства предоставляет удобный способ задания набора файлов метаданных, а также классов и jar-файлов, которые содержат все классы, которые необходимо сохранить в группе.

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Смотрите больше здесь: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

f0ster
источник
1

Все ответы верны. Мета-инфо имеет много целей. Кроме того, вот пример использования контейнера Tomcat.

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

Описание ниже.

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

Tugrul
источник
0

У вас есть файл MANIFEST.MF в папке META-INF. Вы можете определить дополнительные или внешние зависимости, к которым у вас должен быть доступ.

Пример:

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

Source: Head First JSP & Servlet

Пратик Джоши
источник
1
Неясно, сколько из этого цитируется источником, и это не выглядит дословно. Убрано странное форматирование. Не используйте форматирование кода для текста, который не является кодом. Используйте форматирование цитаты для текста, который цитируется.
Маркиз Лорн