Почему некоторые файлы ресурсов помещаются в каталог META-INF

Мне интересно, почему некоторые файлы ресурсов помещаются в каталог META-INF в JAR? Я всегда ставил ресурсы как test.properties в корневой директории. Любое преимущество поместить их в META-INF?

Ответ 1

У многих API-интерфейсов Java (EE) есть контракт, что, когда вы помещаете конкретный файл конфигурации/метаданных в папку META-INF вашего (или стороннего) JAR-сервера, тогда API автоматически выполнит работу по API-интерфейсу, такие как классы сканирования, предварительная загрузка определенных классов и/или выполнение определенного кода на основе метаинформации.

Примером стандартного Java SE API является ServiceLoader. Среди прочего, это совместимые драйверы JDBC 4.0. Таким образом, просто отключение JAR файла JDBC-драйвера автоматически загрузит класс драйвера во время запуска/инициализации Java-приложений без необходимости использования какой-либо ручной строки Class.forName("com.example.Driver") в вашем коде.

Кроме того, имеется Java EE 6, предоставляющий API JSF 2.0, который сканирует при запуске приложения все файлы JAR для файла faces-config.xml в папке META-INF. Если он присутствует, он затем примет его как подсказку для сканирования всего файла JAR для классов, реализующих конкретные аннотации JSF, такие как @ManagedBean, чтобы они автоматически генерируются автоматически и автоматически настраиваются. Это экономит время в потенциально дорогостоящей работе по сканированию тысяч классов во всех JAR-классах во всем пути к классам. В более старых версиях этих API конфигурация обычно выполнялась с помощью (verbose) файлов XML.

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

Ответ 2

В сервлет 3.0 определенные статические ресурсы доступны через веб-контекст, такие как .css, java script и .png файлы, поэтому вам больше не нужно использовать ServletContext getResource() и getResourceAsStream(). Для получения дополнительной информации посетите web-fragment.xml(https://blogs.oracle.com/swchan/entry/servlet_3_0_web_fragment), который является одним ресурсом, который охватывает этот вопрос.

Лично я предпочитаю структурировать свои проекты так, как им нравится Maven, с каталогом src/main/resources, который является частью пути к классу приложений.

Ответ 3

Это просто соглашение, которое некоторые (большинство?) сторонних баннеров используют для поиска файлов, которые вы предоставляете. Для ваших собственных классов и файлов вы можете поместить их туда, где хотите.