Структура 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/.
Чтобы было совсем понятно, посмотри эту схему, которая поможет понять, как и что куда кладется при сборке проекта:

ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ