Какова цель META-INF?

В Java вы часто видите папку META-INF, содержащую некоторые метафайлы. Какова цель этой папки и что я могу там поместить?

Ответ 1

Вообще говоря, вы не должны вкладывать ничего в META-INF самостоятельно. Вместо этого вы должны полагаться на все, что вы используете для упаковки вашего JAR. Это одна из областей, где, по моему мнению, Ant действительно превосходит: указание атрибутов манифеста JAR файла. Очень легко сказать что-то вроде:

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

По крайней мере, я думаю, что легко...: -)

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

Ответ 2

Из официальная спецификация файла 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

Я заметил, что некоторые библиотеки 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 User Guide. В проекте, над которым я работал, в котором нам нужно было разрешить несколько уровней конфигурации через Spring, мы выполнили это соглашение и поместили наши файлы конфигурации в META-INF.

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

Ответ 4

Папка META-INF является папкой для файла MANIFEST.MF. Этот файл содержит метаданные о содержимом JAR. Например, есть запись с именем Main-Class, которая задает имя класса Java со статическим main() для исполняемых файлов JAR.

Ответ 5

Вы также можете разместить статические ресурсы там.

В примере:

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. Вы можете определить метаинформацию для пакетов, если используете java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Вы можете ссылаться на цифровые сертификаты, которые вы хотели бы использовать в режиме апплета/веб-запуска.

Ответ 6

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

Ответ 7

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

Почему это так?

Дело CXF может быть законным. Вот еще одно место, где этот нестандартный рекомендуется для обхода неприятной ошибки в JBoss-ws, которая препятствует проверке на стороне сервера по схеме wsdl.

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

Но на самом деле, кажется, нет никаких стандартов, никаких проблем. Обычно эти вещи очень строго определены, но по некоторым причинам, кажется, здесь нет стандартов. Странно. Кажется, что META-INF стал популярным местом для любой необходимой конфигурации, которая не может быть легко обработана другим способом.

Ответ 8

META-INF в Maven

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

Ответ 9

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

Думайте об этом как о другом корне. С точки зрения метода Enumerator<URL> ClassLoader#getSystemResources(String path) и других:

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

Если указанный путь не начинается с "META-INF", метод выполняет поиск ресурсов во всех других папках (за исключением META-INF) всех jar файлов и каталогов в пути к классам.

Если вам известно другое имя папки, к которому относится метод getSystemResources, прокомментируйте его.

Ответ 10

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

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Подробнее здесь: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

Ответ 11

Все ответы верны. Meta-inf имеет множество целей. Кроме того, здесь приведен пример использования контейнера tomcat.

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

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

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

Ответ 12

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

Пример:

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

Source: Head First Jsp и Servlet