Этап 1 - Maven: основа сборки Java-проектов
Java-проект перестает быть простым, как только в нем появляются пакеты, файлы настроек, тесты, внешние библиотеки и итоговый файл, который должен запускаться на другой машине. В этот момент команда javac Main.java уже не решает задачу. Она может скомпилировать один файл, но не объясняет, где взять библиотеки, куда положить ресурсы, как запустить тесты и как получить готовый JAR.
Инструмент сборки - это программа, которая превращает исходный код в предсказуемый результат. Он компилирует код, копирует ресурсы, запускает тесты, скачивает внешние библиотеки, создает JAR или WAR и может публиковать готовый файл в репозиторий артефактов.

С какой проблемой помогает Maven
Представь проект orders. Он должен принимать HTTP-запросы, читать JSON и отдавать JSON-ответы. Можно попробовать написать HTTP-сервер самому, но в реальной разработке так почти не делают: эту работу уже умеет выполнять Spring Web. Значит, проект orders подключает внешнюю библиотеку spring-boot-starter-web. Maven скачивает ее из репозитория, добавляет в сборку и подтягивает библиотеки, которые нужны самой Spring Web. Это и есть управление зависимостями.
Maven появился, чтобы убрать хаос самописных скриптов и разных структур проектов. Его главная идея называется Convention over Configuration: если проект следует стандартным соглашениям, Maven уже знает, где лежит основной код, ресурсы, тесты и результат сборки.
Стандартная структура каталогов - часть этого соглашения. src/main/java содержит Java-код приложения. src/main/resources содержит файлы, которые должны попасть в classpath при запуске: например application.properties. src/test/java содержит тесты. target - это папка результата сборки; ее не добавляют в Git.
pom.xml означает Project Object Model. Это главный файл Maven-проекта. Он описывает координаты проекта, версию Java, зависимости, плагины, тип упаковки и иногда связь с родительским проектом или модулями.
Жизненный цикл Maven - это цепочка этапов. validate проверяет базовую корректность проекта. compile компилирует основной код. test запускает тесты. package создает артефакт. verify запускает дополнительные проверки. install кладет артефакт в локальный репозиторий ~/.m2. deploy загружает артефакт в удаленный репозиторий.
Последовательность шагов
- Maven читает
pom.xml. - Находит настройки проекта и список зависимостей.
- Скачивает недостающие библиотеки из репозиториев.
- Запускает этапы жизненного цикла: compile, test, package.
- Создает итоговый артефакт, например JAR-файл.
Эта последовательность нужна, чтобы читать Maven-проект не как набор XML-строк, а как понятный процесс: что берем на вход, какие действия выполняем и какой файл получаем на выходе.
Конкретный пример
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.academy</groupId>
<artifactId>orders</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
</project>
Разберем пример по строкам. Его удобнее воспринимать как паспорт проекта: каждая строка отвечает на один конкретный вопрос о том, что Maven собирает.
<project> - корневой элемент Maven-файла. Внутри него находится всё описание проекта: имя, версия, зависимости, плагины и настройки сборки.
<modelVersion>4.0.0</modelVersion> - версия Maven-модели. В обычных проектах почти всегда используется 4.0.0; это не версия твоего приложения, а версия формата pom.xml.
<groupId>com.academy</groupId> - группа, компания или домен команды, которая выпускает проект. Обычно здесь используют обратный домен или название организации.
<artifactId>orders</artifactId> - имя артефакта. В этом примере Maven будет собирать проект с именем orders: библиотеку или приложение для работы с заказами.
<version>1.0.0</version> - версия этого артефакта. Если позже выйдет новая версия проекта, значение можно изменить, например на 1.1.0.
Три значения вместе - groupId, artifactId и version - образуют точный адрес артефакта: com.academy:orders:1.0.0. По такому адресу Maven понимает, какой именно файл нужно собрать, найти в локальном репозитории или скачать из удаленного репозитория.
Блок <properties> хранит настройки, которые можно переиспользовать. Строка <maven.compiler.release>17</maven.compiler.release> говорит Maven-компилятору собирать проект под Java 17. Без такой настройки на разных компьютерах проект может случайно собираться разными версиями Java.
Чтобы подключить Spring Web, добавляют секцию зависимостей:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
После этого код проекта может использовать классы из Spring Web, а Maven сам скачает нужные файлы из репозитория.
Полезная таблица
| Понятие | Значение |
|---|---|
mvn clean | Удаляет папку target, чтобы следующая сборка началась с чистого результата. |
mvn compile | Компилирует основной код проекта. |
mvn package | Выполняет предыдущие этапы и создает JAR или WAR. |
mvn install | Кладет артефакт в локальный репозиторий ~/.m2. |
mvn dependency:tree | Показывает дерево зависимостей. |
mvn dependency:analyze | Ищет лишние и не объявленные зависимости. |
Где это встречается в работе
Maven используют, когда нужен стабильный и хорошо знакомый Java-процесс сборки. Его XML может казаться многословным, но почти любой Java-разработчик открывает Maven-проект и быстро понимает, как он собирается.
Частые ошибки
- Переводить или переименовывать служебные XML-теги Maven. Теги
artifactId,dependencies,versionдолжны оставаться как есть. - Коммитить папку
targetв Git. - Добавлять зависимости наугад и не смотреть
mvn dependency:tree. - Путать этап Maven, например
package, с конкретной целью плагина, напримерdependency:tree.
Чеклист понимания
- Я понимаю, почему одного
javacнедостаточно для реального проекта. - Я могу объяснить, что такое
pom.xml. - Я понимаю разницу между этапом Maven и целью плагина.
- Я могу объяснить, как Maven подключает внешнюю библиотеку.
Вопросы для самопроверки
- Почему проекту
ordersвыгоднее подключить Spring Web, чем писать HTTP-сервер с нуля? - Что означают
groupId,artifactIdиversion? - Что произойдет при запуске
mvn package?
Практика перед следующим уроком
Создайте минимальный Maven-проект с groupId, artifactId, version и Java 17 в pom.xml. Подключите одну зависимость, например spring-boot-starter-web, затем запустите mvn dependency:tree и запишите, какие библиотеки Maven добавил кроме той, которую вы указали напрямую.