Почему некоторые файлы ресурсов находятся в каталоге META-INF - PullRequest
13 голосов
/ 10 апреля 2011

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

Ответы [ 3 ]

13 голосов
/ 10 апреля 2011

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

Примером, предоставляемым стандартным API Java SE, является 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 конфигурация обычно выполнялась с помощью (подробных) XML-файлов.

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

4 голосов
/ 10 апреля 2011

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

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

2 голосов
/ 10 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...