Какова цель META-INF?
в Java вы часто видите папку META-INF, содержащую некоторые мета-файлы. Какова цель этой папки и что я могу туда поместить?
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 / MANIFEST.MF имеет особое значение:
- если вы запустите банку с помощью
java -jar myjar.jar org.myserver.MyMainClass
вы можете переместить определение основного класса в банку, чтобы вы могли сжать вызов вjava -jar myjar.jar
. - вы можете определить Metainformations для пакетов, Если вы использовать
java.lang.Package.getPackage("org.myserver").getImplementationTitle()
. - вы можете ссылаться на цифровые сертификаты, которые вы хотите использовать в режиме апплета/Webstart.
просто добавить к информации здесь, в случае файла войны, META-INF / MANIFEST.Файл MF предоставляет разработчику возможность инициировать проверку времени развертывания контейнером, которая гарантирует, что контейнер может найти все классы, от которых зависит ваше приложение. Это гарантирует, что в случае, если вы пропустили банку, вам не нужно ждать, пока ваше приложение взорвется во время выполнения, чтобы понять, что оно отсутствует.
Я недавно думал об этом вопросе. На самом деле, похоже, нет никаких ограничений на использование 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 META-INF папка понимается из-за Стандартный Макет Каталога который по имени конвенции пакет ресурсов проекта в JARs: любые каталоги или файлы, размещенные в ${basedir} / src/main / resources каталог упаковываются в банку с точно такой же структурой, начиная с основания банки. Папка ${basedir} / src/main/ресурсы / META-INF обычно содержит .свойства файлы, в то время как в баночке содержится сгенерированный манифест.MF, пом.свойства, the пом.в XML, среди других файлов. Также фреймворки, такие как Весна использовать classpath:/META-INF/resources/
для обслуживания веб-ресурсов. Дополнительные сведения см. В разделе как добавить ресурсы в мой проект Maven
добавление к информации здесь, META-INF-это специальная папка, в которой ClassLoader
обрабатывает по-разному от других папок в банке.
Элементы, вложенные в папку META-INF, не смешиваются с элементами за ее пределами.
думайте об этом как о другом корне. От Enumerator<URL> ClassLoader#getSystemResources(String path)
метод и др. перспектива:
когда данный путь начинается с "META-INF", метод ищет ресурсы, которые вложены внутри папок META-INF всех jars в путь к классу.
когда данный путь не начинается с "META-INF", метод ищет ресурсы во всех других папках (вне META-INF) всех jars и каталогов в пути к классу.
Если вы знаете о другом имени папки, что getSystemResources
метод лечит специально, пожалуйста, прокомментируйте об этом.
все ответы верны. Meta-inf имеет много целей. Кроме того, вот пример использования контейнера tomcat.
перейти к Tomcat Doc и проверить "стандартная реализация > copyXML атрибут".
описание ниже.
установите значение true, если вы хотите, чтобы контекстный XML-дескриптор был встроен в приложение (находится в /META-INF/context.xml), который будет скопирован в xmlbase хоста-владельца, когда приложение развернутый. При последующих запусках скопированный контекстный XML-дескриптор будет использоваться в предпочтении любому контекстному XML-дескриптору, внедренному в приложение, даже если дескриптор, внедренный в приложение, является более поздним. Значение флага по умолчанию false. Если атрибут deployXML владельца хостинга является ложной или если атрибут copyXML из владения хозяина правда, этот атрибут будет иметь никакого эффекта.
У вас есть манифест.MF-файл внутри вашей папки META-INF. Ты можешь!--3-->определить необязательные или внешние зависимости к которому у вас должен быть доступ.
пример:
подумайте, что вы развернули свое приложение, и ваш контейнер (во время выполнения) обнаружил, что вашему приложению требуется более новая версия библиотеки, которая не находится в папке lib, в этом случае, если вы определили дополнительную более новую версию в MANIFEST.MF
тогда ваше приложение будет ссылаться на зависимость от там (и не разобьется).
Source:
Первый JSP & Servlet