← Назад к вопросам

Какие знаешь этапы сборки в Maven?

1.7 Middle🔥 141 комментариев
#Базы данных и SQL

Комментарии (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

  1. Используй mvn clean install перед коммитом
  2. Пропускай тесты осторожно (только в крайних случаях)
  3. Профилируй сборку mvn clean install -DskipTests -X для анализа
  4. Используй свежий кэш mvn clean перед критичной сборкой
  5. Проверяй зависимости mvn dependency:tree регулярно
Какие знаешь этапы сборки в Maven? | PrepBro