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

Что такое Maven-плагины?

2.0 Middle🔥 251 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Maven-плагины

Maven-плагины это модульные компоненты, которые выполняют специфичные задачи в процессе сборки проекта. Это мощный механизм расширяемости Maven, который позволяет автоматизировать практически любую задачу сборки.

1. Базовое понимание Maven lifecycle

Maven использует концепцию lifecycle — набор фаз:

clean → validate → compile → test → package → integration-test → 
→ verify → install → deploy

Каждая фаза выполняет определённые плагины:

mvn clean          # Запускает clean lifecycle
mvn compile        # validate + compile
mvn test           # validate + compile + test
mvn package        # Все до package
mvn install        # Все до install

2. Что такое плагин

Плагин это JAR файл, который содержит goals (цели) — Java классы, наследующие AbstractMojo:

// Пример плагина (goal)
import org.apache.maven.plugin.AbstractMojo;

public class HelloMojo extends AbstractMojo {
    @Parameter(property = "greeting")
    private String greeting;
    
    @Override
    public void execute() {
        getLog().info(greeting);
    }
}

Каждый плагин может иметь несколько goals:

  • maven-compiler-plugin: compile, testCompile
  • maven-surefire-plugin: test
  • maven-shade-plugin: shade

3. Встроенные плагины

Maven поставляется с базовыми плагинами:

<!-- pom.xml -->

<!-- Компиляция Java -->
<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>
</plugin>

<!-- Запуск тестов -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0</version>
</plugin>

<!-- Сборка JAR -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
</plugin>

4. Конфигурация плагинов

Goals привязаны к фазам lifecycle:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <!-- Привязка goal'а compile к фазе compile -->
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
    <!-- Конфигурация -->
    <configuration>
        <source>17</source>
        <target>17</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

5. Популярные плагины

maven-shade-plugin (упаковка с зависимостями):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.5.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.App</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Результат: app-jar-with-dependencies.jar с ВСЕ зависимостями внутри.

maven-assembly-plugin (создание дистрибутива):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <descriptors>
            <descriptor>src/assembly/bin.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

maven-jacoco-plugin (покрытие кода):

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>default-report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

После: mvn clean test генерирует report в target/site/jacoco/index.html.

maven-checkstyle-plugin (анализ кода):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.3.1</version>
    <configuration>
        <configLocation>google_checks.xml</configLocation>
    </configuration>
</plugin>

maven-release-plugin (релиз версии):

mvn release:prepare release:perform

Автоматически:

  • Увеличивает версию
  • Создаёт tag в git
  • Запускает deploy

6. Плагины для Spring Boot

spring-boot-maven-plugin (очень важный):

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>3.0.0</version>
    <!-- Создаёт "fat jar" с embedded Tomcat -->
</plugin>

Без этого плагина Spring Boot приложение не запустится:

mvn package              # Создаёт app.jar
java -jar target/app.jar # Работает!

7. Плагины для отладки

exec-maven-plugin (запуск Java кода):

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <mainClass>com.example.App</mainClass>
    </configuration>
</plugin>

<!-- Запуск -->
mvn exec:java

maven-help-plugin (информация):

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
mvn help:active-profiles
mvn dependency:tree

8. Properties и параметры плагинов

Передача параметров:

# Из command line
mvn clean package -Dmaven.test.skip=true
mvn compile -Dcompiler.target=21

# Через конфигурацию
<configuration>
    <skip>false</skip>
    <skipTests>true</skipTests>
    <encoding>UTF-8</encoding>
</configuration>

9. Порядок выполнения плагинов

Плагины выполняются в порядке определения в pom.xml:

<plugins>
    <!-- 1. Выполнится первым -->
    <plugin>...</plugin>
    
    <!-- 2. Выполнится вторым -->
    <plugin>...</plugin>
    
    <!-- 3. Выполнится третьим -->
    <plugin>...</plugin>
</plugins>

10. Проблемы и решения

Проблема: плагин не нашёлся

[ERROR] Could not find goal 'shade' in plugin org.apache.maven.plugins:maven-compiler-plugin

Решение: добавить плагин в pom.xml.

Проблема: плагин тормозит сборку

# Пропустить плагин
mvn package -Dskip-shade-plugin

# Или отключить в конфиге
<skip>true</skip>

Проблема: версия плагина конфликтует

<!-- Явно указать версию -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
</plugin>

11. Best practices

1. Версионируй все плагины:

<!-- Плохо -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
</plugin>

<!-- Хорошо -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
</plugin>

2. Используй pluginManagement:

<pluginManagement>
    <plugins>
        <plugin>...</plugin>
    </plugins>
</pluginManagement>

3. Группируй плагины логично:

<build>
    <!-- Обязательные плагины сборки -->
    <plugins>...</plugins>
    
    <!-- Плагины для тестирования (опционально) -->
    <testPlugins>...</testPlugins>
</build>

12. Вывод

Maven-плагины это сердце Maven. Они:

  • Компилируют код
  • Запускают тесты
  • Упаковывают приложение
  • Анализируют качество
  • Деплоят на сервер

Понимание плагинов критично для professional Java разработчика. Рекомендую:

  1. Знать основные плагины: compiler, surefire, jar, shade
  2. Уметь конфигурировать в pom.xml
  3. Понимать lifecycle phases
  4. Уметь отлаживать проблемы с плагинами

Временно потраченное на изучение плагинов окупается в 10 раз через экономию на CI/CD настройке.