1. Структура 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 | дескриптор розгортання |
2. Структура 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/.
Щоб було зрозуміло, подивися схему того як, що і куди кладеться при складанні проєкту:

ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ