Структура war-файла

Каждое веб-приложение, когда оно заливается на веб-сервер, упаковано в единый war-файл. WAR сейчас расшифровывается как Web Application Resources, хотя раньше это было Web ARchive. Фактически это zip-архив, который содержит в себе упакованное веб-приложение.

Вот как выглядит типичное содержание war-файла:

/index.html
/guestbook.jsp
/images/logo.png
/js/jquery.js
/WEB-INF/web.xml
/WEB-INF/classes/com/javarush/Util.class
/WEB-INF/classes/com/javarush/MainServlet.class
/WEB-INF/classes/application.properties
/WEB-INF/lib/util.jar
/META-INF/MANIFEST.MF

Внутри war-файла лежат статические веб-ресурсы, такие как файлы .html, .css, .js и так далее. Так же там могут быть картинки, видео и вообще любые файлы. Они могут лежать в корне или в подпапках, это не имеет значения. Tomcat будет просто отдавать их, если на них поступит запрос.

Допустим, твое веб-приложение загружено на веб-сервер под именем apple, тогда при запросе http://localhost/apple/images/logo.png Tomcat отдаст файл /images/logo.png.

Отдельно стоит отметить папку WEB-INF. Она предназначена для хранения в ней Java-кода. Tomcat не будет отдавать наружу ее содержимое.

/WEB-INF/classes/ каталог для скомпилированных Java-классов, не объединенных в JAR-архивы, включая классы сервлета и файлы ресурсов, необходимые загрузчику перед выполнением приложения
/WEB-INF/lib/ место для хранения jar-библиотек
/WEB-INF/web.xml дескриптор развертывания

Структура war-файла и Maven-проект

Теперь перейдем к иерархии каталогов проекта Maven. Полную схему каталога можно посмотреть в официальном руководстве. Здесь мы ознакомимся с ней в несколько сокращенном варианте, исключив тестовые ресурсы. Итак, стандартная иерархия каталогов Maven имеет вид:

src/main/java исходники классов и библиотек приложения в соответствии с общепринятой иерархией пакетов
src/main/resources файлы ресурсов приложения: настройки баз данных, файлы локализации и т. д.
src/main/webapp ресурсы веб-приложения (JSP-файлы, текстовые файлы, скрипты и т. п.)

Как видишь, она существенно отличается от известной вам структуры WAR-файла. Но на самом деле при компиляции веб-приложения происходит простое перемещение и объединение файлов в структуру, определенную в спецификации Java EE.

Каталог src/main/webapp определяет корневой контекст веб-приложения (при развертывании на сервере корневой контекст совпадает с именем WAR-файла) и уже содержит внутри себя каталог WEB-INF. То есть содержимое src/main/webapp полностью переносится в веб-приложение.

Все твои Java-классы компилируются в class-файлы и, сохраняя свою структуру пакетов, перемещаются в каталог /WEB-INF/classes/. JAR-архивы подключенных библиотек, которые определены в зависимостях pom.xml файла Maven'а, как мы определили выше, перемещаются в каталог /WEB-INF/lib/.

Ресурсы приложения src/main/resources переносятся в classpath приложения, а конкретно в тот же каталог /WEB-INF/classes/.

Чтобы было совсем понятно, посмотри эту схему, которая поможет понять, как и что куда кладется при сборке проекта:

Устройство war-файла