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


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

12 251

12 ответов:

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

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

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

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

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

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

Я заметил, что некоторые библиотеки Java начали использовать META-INF в качестве каталога, в который можно включить файлы конфигурации, которые должны быть упакованы и включены в путь к классам вместе с JARs. Например, 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. Но, похоже, это новый стандарт де-факто; либо это, либо новый анти-шаблон : -)

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

пример:

META-INF/resources/button.jpg 

и получить их в web3. 0-контейнер через

http://localhost/myapp/button.jpg

> подробнее

манифест /META-INF/.МФ имеет особое значение:

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

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

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

Почему это произошло?

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

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

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

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

META-INF в Maven

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

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

думайте об этом как о другом корне. Из Enumerator<URL> ClassLoader#getSystemResources(String path) метод и др. перспектива:

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

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

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

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

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

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

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

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

пример:

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

Source: Head First Jsp & Servlet