Логотип Workflow

Article

Updated at:

Stage 1: Maven Basics

Этап 1 - Maven: основа сборки Java-проектов

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

Инструмент сборки - это программа, которая превращает исходный код в предсказуемый результат. Он компилирует код, копирует ресурсы, запускает тесты, скачивает внешние библиотеки, создает JAR или WAR и может публиковать готовый файл в репозиторий артефактов.

Этап 1 - Maven: основа сборки Java-проектов

С какой проблемой помогает 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 загружает артефакт в удаленный репозиторий.

Последовательность шагов

  1. Maven читает pom.xml.
  2. Находит настройки проекта и список зависимостей.
  3. Скачивает недостающие библиотеки из репозиториев.
  4. Запускает этапы жизненного цикла: compile, test, package.
  5. Создает итоговый артефакт, например 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 подключает внешнюю библиотеку.

Вопросы для самопроверки

  1. Почему проекту orders выгоднее подключить Spring Web, чем писать HTTP-сервер с нуля?
  2. Что означают groupId, artifactId и version?
  3. Что произойдет при запуске mvn package?

Практика перед следующим уроком

Создайте минимальный Maven-проект с groupId, artifactId, version и Java 17 в pom.xml. Подключите одну зависимость, например spring-boot-starter-web, затем запустите mvn dependency:tree и запишите, какие библиотеки Maven добавил кроме той, которую вы указали напрямую.

Авторизуйтесь чтоб пройти тесты

Practice

Интерактивная практика

Выполните задания и сразу проверьте ответ.