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

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

266 голосов
/ 16 сентября 2008

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

Ответы [ 12 ]

156 голосов
/ 16 сентября 2008

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

Каталог META-INF

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

  • MANIFEST.MF

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

  • INDEX.LIST

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

  • x.SF

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

  • x.DSA

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

  • services/

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

61 голосов
/ 16 сентября 2008

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

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

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

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

24 голосов
/ 25 ноября 2008

Я заметил, что некоторые библиотеки 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. Но, похоже, это де-факто новый стандарт; или это, или появляющийся антипаттерн: -)

10 голосов
/ 16 сентября 2008

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

8 голосов
/ 15 января 2013

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

Например:

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. Вы можете ссылаться на цифровые сертификаты, которые хотите использовать в режиме апплета / веб-запуска.
4 голосов
/ 22 апреля 2016

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

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

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

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

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

4 голосов
/ 11 октября 2011

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

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

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

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

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

4 голосов
/ 21 октября 2009

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

3 голосов
/ 12 января 2015

МЕТА-ИНФ в Maven

В Maven папка META-INF понимается из-за Стандартного макета каталога , который по соглашению имен упаковывает ресурсы вашего проекта в JAR: любые каталоги или файлы, помещенные в * 1007 Каталог * $ {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

3 голосов
/ 23 октября 2009

Если вы используете 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

...