Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Этапы сборки (Build Lifecycle) в Maven
Maven использует концепцию Build Lifecycle - последовательность этапов (phases), которые выполняются при сборке проекта. Понимание этого критично для эффективной работы с Maven.
1. Три основных жизненных цикла
Maven имеет три независимых Build Lifecycle:
# 1. DEFAULT LIFECYCLE - основной цикл разработки
mvn validate # валидирует структуру проекта
mvn compile # компилирует исходный код
mvn test # запускает тесты
mvn package # упаковывает скомпилированный код (JAR, WAR)
mvn install # устанавливает артефакт в локальный репозиторий
mvn deploy # развёртывает артефакт в удалённый репозиторий
# 2. CLEAN LIFECYCLE - очистка
mvn clean # удаляет директорию target и все скомпилированные файлы
# 3. SITE LIFECYCLE - генерирование документации
mvn site # генерирует сайт проекта (документация, отчёты)
2. DEFAULT LIFECYCLE - полный разбор этапов
public class MavenBuildPhases {
/*
Фаза | Описание
---
validate | Проверяет что проект валиден (структура, зависимости)
initialize | Инициализирует свойства сборки
generate-sources | Генерирует исходный код (протоколы, конфиги)
process-sources | Обрабатывает исходный код (фильтрация)
generate-resources | Генерирует ресурсы (конфиги, свойства)
process-resources | Копирует и обрабатывает ресурсы
compile | Компилирует исходный код в .class файлы
process-classes | Обрабатывает скомпилированные классы (byte-code)
generate-test-sources | Генерирует исходный код для тестов
process-test-sources | Обрабатывает исходный код тестов
generate-test-resources | Генерирует ресурсы для тестов
process-test-resources | Копирует ресурсы тестов
test-compile | Компилирует тесты
process-test-classes | Обрабатывает скомпилированные тестовые классы
test | Запускает unit тесты (не требует упаковки)
prepare-package | Подготавливает к упаковке (промежуточная)
package | Упаковывает скомпилированный код в JAR/WAR/EAR
pre-integration-test | Подготавливает интеграционные тесты
integration-test | Запускает интеграционные тесты
post-integration-test | Закрывает интеграционные тесты
verify | Запускает проверки (код-качество, покрытие)
install | Устанавливает артефакт в локальный репозиторий
deploy | Развёртывает артефакт в удалённый репозиторий
*/
}
3. Практические примеры команд
# Выполнить только одну фазу (выполнятся все предыдущие)
mvn compile # выполнит: validate, initialize, generate-*, process-*, compile
mvn test # выполнит: все до test включительно
mvn package # выполнит: все до package
mvn install # выполнит: все до install (включая deploy в локальное хранилище)
# Комбинировать lifecycle'ы
mvn clean install # сначала очистить, потом полная сборка
mvn clean test # очистить и запустить тесты
mvn clean package # очистить и упаковать
# Запустить несколько фаз
mvn compile test package # выполнить эти фазы последовательно
# С опциями
mvn clean install -DskipTests # пропустить тесты
mvn clean install -Dmaven.test.skip=true # альтернативный способ
mvn clean install -X # debug режим (много логов)
mvn clean install -q # quiet режим (минум логов)
mvn clean install -T 1C # использовать 1 core на thread
4. Goals (цели) - действия плагинов
Каждая фаза связана с Goals из плагинов:
<!-- pom.xml -->
<build>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal> <!-- цель (goal) компилятора
</goals>
</execution>
</executions>
</plugin>
<!-- Maven Surefire Plugin для тестов -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M9</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal> <!-- цель для запуска тестов
</goals>
</execution>
</executions>
</plugin>
<!-- Maven JAR Plugin для упаковки -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal> <!-- цель для создания JAR
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
5. Запуск конкретного Goal без фазы
# Синтаксис: mvn groupId:artifactId:version:goal
mvn org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile
# Или использовать префикс плагина (если зарегистрирован)
mvn compiler:compile # компилировать исходный код
mvn surefire:test # запустить тесты
mvn jar:jar # создать JAR
mvn dependency:tree # показать дерево зависимостей
mvn dependency:resolve # разрешить все зависимости
mvn help:describe -Dplugin=surefire # информация о плагине
6. Custom фазы и Goals
<!-- Пример: запустить custom скрипт на определённой фазе -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>prepare-deployment</id>
<phase>prepare-package</phase> <!-- кастомная фаза
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<!-- выполнить Ant скрипт -->
<echo>Preparing for deployment...</echo>
<delete dir="${project.build.directory}/old"/>
</target>
</configuration>
</execution>
</executions>
</plugin>
7. CLEAN LIFECYCLE
# Очистка проекта
mvn clean # удаляет target директорию
# Фазы в CLEAN lifecycle:
# pre-clean - перед очисткой
# clean - удаление скомпилированных файлов
# post-clean - после очистки
# Используется перед переборкой для удаления старых артефактов
mvn clean install # сначала очистить, потом собрать
8. SITE LIFECYCLE
mvn site # генерирует сайт проекта
mvn site:deploy # развёртывает сайт
# Фазы в SITE lifecycle:
# pre-site - подготовка
# site - генерирование сайта
# post-site - постобработка
# site-deploy - развёртывание
9. Профили (Profiles) для разных окружений
<!-- pom.xml -->
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>true</debug> <!-- debug информация
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>production</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>false</debug> <!-- no debug
<optimize>true</optimize> <!-- оптимизация
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
# Использование профилей
mvn clean install -Pproduction # собрать с production профилем
mvn clean install -Pdevelopment # собрать с development профилем
mvn clean install -Pproduction,integration # несколько профилей
10. Важные параметры и переменные
public class MavenProperties {
/*
Встроенные переменные Maven:
${project.basedir} - корневая директория проекта
${project.build.directory} - целевая директория (обычно target)
${project.build.sourceDirectory} - src/main/java
${project.build.testSourceDirectory} - src/test/java
${project.name} - название проекта
${project.version} - версия проекта
${maven.version} - версия Maven
${java.version} - версия Java
${os.name} - название OS
*/
}
<!-- Использование в pom.xml -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<myapp.version>1.0.0</myapp.version>
</properties>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
</build>
Итоговая таблица фаз
Лифтайкл | Фазы | Назначение
---
DEFAULT | validate → install | Основная сборка
CLEAN | pre-clean, clean | Очистка проекта
SITE | site, site-deploy | Документация
Best Practices
- Используй
mvn clean installперед коммитом - Пропускай тесты осторожно (только в крайних случаях)
- Профилируй сборку
mvn clean install -DskipTests -Xдля анализа - Используй свежий кэш
mvn cleanперед критичной сборкой - Проверяй зависимости
mvn dependency:treeрегулярно