В Maven War есть папка META-INF в двух местах

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

app.war
  |__META-INF
  |    |___context.xml
 ...

Я думаю, что это уже странно, поскольку местоположение META-INF по умолчанию для WAR находится в папках классов.

app.war
  |__WEB-INF
  |    |__classes
  |         |__META-INF
 ...

Итак, я использую Maven, в котором говорится, что что-либо в src/main/resources/META-INF будет скопировано в соответствующее место, которое оно делает. Странно то, что он также создает папку META-INF в корне файловой структуры, оставляя меня с двумя папками META-INF.

Структура проекта

app
  |__src/main/java
  |__src/main/resources
  |       |__META-INF
  |             |__context.xml
 ...

После пакета mvn

 app
  |__META-INF [1]
  |__WEB-INF
  |     |__classes
  |           |__META-INF [2]
  |                  |__context.xml
 ...

Итак, если в военном стандарте указано, что META-INF должен находиться под папкой классов, как в # 2, почему maven war создает папку # 1. И есть ли способ скопировать файлы в эту папку вместо # 2?

Привет

Ответ 1

Итак, я нашел это:

Две папки Meta-Inf - нормальная структура?

в котором говорится, что наличие двух папок META-INF не является проблемой. Копаю немного, я нашел:

Спецификация файла JAR

в котором говорится о папке META-INF:

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

и это:

JSR-000315 JavaTM Servlet 3.0

который в разделе 10.6 описывает структуру файла WAR:

При упаковке в такую ​​форму будет присутствовать каталог META-INF, который содержит информацию, полезную для инструментов архива Java. Этот каталог не должен быть напрямую служил в качестве содержимого контейнером в ответ на запрос веб-клиентов, хотя его содержимое отображается в сервлет-коде через getResource и getResourceAsStream вызывает ServletContext. Кроме того, любые запросы на доступ к ресурсам в META-INF каталог должен быть возвращен с ответом SC_NOT_FOUND (404).

Итак, из спецификации WAR правильное место - WEB-INF/classes/META-INF. Тем не менее, поскольку война является специальным файлом jar, имеет смысл иметь /META -INF в качестве точки для расширений. Можно увидеть такие разные применения в файлах JPA persistence.xml и Tomcat context.xml: первый должен быть помещен в WEB-INF/classes/META-INF, а последний в/META-INF.