Maven ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-11-07

Плагины Maven: подключение, настройка, executions и обзор плагинов

В проекте нет ни одного упоминания версии Java в pom.xml, а в коде есть public record Order(String id, int total) {}. JDK 25 установлен, но mvn compile падает: Order.java:[3,8] records are not supported in -source 8 (use -source 16 or higher to enable records). Компилирует не Maven, а плагин maven-compiler-plugin, и если его не настроить, он берёт свои значения по умолчанию. В свежих версиях Maven 3.9.x это плагин 3.13.0, а у него по умолчанию версия языка 8, независимо от установленного JDK.

Плагин Maven (plugin) — это артефакт с набором действий, которые Maven выполняет при сборке: компиляция, запуск тестов, упаковка в jar, проверка стиля кода, генерация документации. Каждое действие плагина называется целью (goal). Сам Maven почти ничего не умеет: всю работу делают цели плагинов, привязанные к фазам жизненного цикла или вызванные из командной строки. Плагин подключают и настраивают в разделе <build><plugins> файла pom.xml.

Плагин и цель (goal): как запустить плагин

Чтобы запустить плагин Maven, указывают его цель: mvn checkstyle:check, где checkstyle — префикс плагина, а check — цель. У одного плагина может быть несколько целей: у maven-compiler-plugin это compile и testCompile, у maven-pmd-plugin — pmd, cpd, check и cpd-check. Ту же цель можно вызвать по полным координатам плагина.

Форма вызова Пример Какая версия плагина используется
prefix:goal mvn checkstyle:check Из pom.xml или pluginManagement; если там нет — версия по умолчанию из Maven или последняя из репозитория
groupId:artifactId:goal mvn org.apache.maven.plugins:maven-checkstyle-plugin:check Так же, как в предыдущей строке
groupId:artifactId:version:goal mvn org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:check Ровно указанная, независимо от pom.xml

Короткий префикс Maven ищет только в группах плагинов из настройки pluginGroups: по умолчанию это org.apache.maven.plugins и org.codehaus.mojo. Префикс плагина из другой группы, например spotbugs (com.github.spotbugs), работает, только если плагин объявлен в pom.xml проекта. Имя артефакта префиксом не является, поэтому форма из старых статей mvn maven-checkstyle-plugin:check не работает:

[ERROR] No plugin found for prefix 'maven-checkstyle-plugin' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories

Цель, вызванная напрямую, выполняется одна, без предыдущих шагов сборки. Чем это отличается от запуска фазы и почему mvn jar:jar может дать пустой jar, разобрано в разделе Фаза и цель (goal).

Объявление плагина в pom.xml

Плагин объявляют в pom.xml внутри <build><plugins> элементом <plugin> с координатами groupId, artifactId и version (GAV) — так же, как зависимости, плагины идентифицируются по GAV. Объявление позволяет зафиксировать версию плагина, задать параметры и привязать цели к фазам сборки.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.6.0</version>
        </plugin>
    </plugins>
</build>

Если groupId не указан, подставляется org.apache.maven.plugins, но для читаемости его лучше писать. Версию указывать обязательно: без неё Maven выдаёт предупреждение 'build.plugins.plugin.version' ... is missing, а сборка зависит от версии установленного Maven. Номера версий в примерах урока реальные, но актуальную версию всегда сверяйте на Maven Central или на странице Available Plugins. Что такое GAV и как устроен раздел <build>, описано в уроке Файл pom.xml в Maven.

Само по себе объявление плагина без <executions> ничего не запускает: оно лишь фиксирует версию и настройки для случаев, когда цель вызвана из командной строки или привязана к фазе стандартным жизненным циклом.

Настройка плагина: configuration и свойства

Параметры плагина задают в элементе <configuration>: каждый вложенный тег — это имя параметра цели. Многие параметры можно задать и через свойство в <properties> или из командной строки ключом -D: такое свойство называется user property параметра (например, maven.compiler.release или checkstyle.skip).

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

Если параметр задан явно в <configuration>, свойство с тем же смыслом его не переопределит; ключ -D работает только для параметров, которые в pom.xml не заданы явно. Список параметров и их user property выводит плагин maven-help-plugin:

mvn help:describe -Dplugin=compiler -Ddetail

Вывод (фрагмент):

Name: Apache Maven Compiler Plugin
...
Goal Prefix: compiler

This plugin has 3 goals:

compiler:compile
  Description: Compiles application sources.
  ...
    release
      User property: maven.compiler.release
      The -release argument for the Java compiler, supported since Java9
...
compiler:help
compiler:testCompile

Привязка к фазе: executions

Чтобы цель плагина выполнялась автоматически при сборке, её привязывают к фазе жизненного цикла в блоке <executions>. Каждое <execution> содержит уникальный <id>, фазу <phase> и список целей <goals>; при запуске этой фазы (или любой более поздней) Maven выполнит перечисленные цели.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <!-- plugin-level: used by all executions and by the command line -->
        <configLocation>google_checks.xml</configLocation>
        <violationSeverity>warning</violationSeverity>
    </configuration>
    <executions>
        <execution>
            <id>validate-style</id>
            <phase>validate</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Теперь mvn package первым делом проверит стиль. Вывод для класса с отступами в 4 пробела (фрагмент; google_checks.xml требует 2 пробела):

[INFO] --- checkstyle:3.6.0:check (validate-style) @ shop ---
[WARN] /home/user/shop/src/main/java/com/examclouds/shop/App.java:5:5: 'method def modifier' has incorrect indentation level 4, expected level should be 2. [Indentation]
...
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:check (validate-style) on project shop: You have 3 Checkstyle violations.

Что важно знать про executions:

  • Фаза по умолчанию. У многих целей фаза уже задана автором плагина: checkstyle:check, pmd:check и spotbugs:check по умолчанию привязаны к verify. Тогда <phase> можно не писать, достаточно <goals>. Если у цели нет фазы по умолчанию и <phase> не указана, цель в сборке не выполнится.
  • Где писать configuration. Настройки на уровне <plugin> действуют на все executions и на вызов из командной строки. Настройки внутри <execution> — только на это execution. Команда mvn checkstyle:check выполняется с id default-cli и их не увидит.
  • Несколько executions. Одну цель можно запустить дважды с разными настройками, дав executions разные id. Одинаковые id в одном плагине — ошибка чтения POM.
  • Отключение унаследованного execution. Если execution пришло от родительского POM, в дочернем модуле его отключают, повторив тот же id с <phase>none</phase>.

Какие цели уже привязаны к фазам без всякого объявления (компиляция, тесты, упаковка) и в каком порядке выполняются цели одной фазы, показано в разделе Привязка целей плагинов к фазам.

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

Плагины Maven делятся на две группы. Первые подключены по умолчанию через жизненный цикл: clean, resources, compiler, surefire, jar, install, deploy, site. Вторые нужно объявить в pom.xml явно: failsafe, javadoc, checkstyle, shade, gpg и другие. Официальные плагины имеют groupId org.apache.maven.plugins, многие полезные плагины публикует сообщество MojoHaus (org.codehaus.mojo).

Плагин Основные цели Что делает Подключён по умолчанию
maven-clean-plugin clean:clean Удаляет каталог target Да (цикл clean)
maven-resources-plugin resources:resources, resources:testResources Копирует ресурсы в target/classes, при необходимости фильтрует ${...} Да
maven-compiler-plugin compiler:compile, compiler:testCompile Компилирует основной и тестовый код (подробнее) Да
maven-surefire-plugin surefire:test Запускает unit-тесты Да
maven-failsafe-plugin failsafe:integration-test, failsafe:verify Запускает интеграционные тесты (подробнее) Нет
maven-jar-plugin, maven-war-plugin, maven-ear-plugin jar:jar, war:war, ear:ear Упаковывают jar, веб-архив war или корпоративный архив Jakarta EE (ear) — в зависимости от packaging Да, по packaging
maven-install-plugin, maven-deploy-plugin install:install, deploy:deploy Копируют артефакт в локальный репозиторий / публикуют в удалённый Да
maven-site-plugin site:site, site:deploy Генерирует HTML-сайт проекта с отчётами из раздела <reporting> Да (цикл site)
maven-javadoc-plugin javadoc:javadoc, javadoc:jar Генерирует документацию Javadoc и jar с ней (подробнее) Нет
maven-source-plugin source:jar-no-fork Собирает jar с исходниками (-sources.jar) Нет
maven-gpg-plugin gpg:sign Подписывает артефакты ключом GPG (файлы .asc); подписи обязательны для публикации в Maven Central Нет
maven-shade-plugin shade:shade Собирает «толстый» jar вместе с зависимостями Нет
maven-dependency-plugin dependency:tree, dependency:analyze Анализ и копирование зависимостей (подробнее) Вызывается без объявления
maven-help-plugin help:describe, help:effective-pom Описание плагинов и итоговая модель проекта Вызывается без объявления
versions-maven-plugin (MojoHaus) versions:display-plugin-updates, versions:display-dependency-updates Показывает доступные обновления плагинов и зависимостей Вызывается без объявления
maven-enforcer-plugin enforcer:enforce Останавливает сборку при нарушении правил (версия Java, конфликты зависимостей) Нет
maven-archetype-plugin archetype:generate Создаёт проект по шаблону (подробнее) Вызывается без объявления
maven-plugin-plugin plugin:descriptor Генерирует дескриптор при разработке собственного плагина (packaging = maven-plugin) Да, для maven-plugin

«Вызывается без объявления» означает, что цель можно запустить из командной строки (mvn dependency:tree), но в обычную сборку плагин не входит, пока его не привяжут к фазе. Плагины проверки кода Checkstyle, PMD и SpotBugs разобраны ниже.

maven-compiler-plugin: версия Java и параметры компиляции

maven-compiler-plugin компилирует исходники проекта: цель compile — код из src/main/java, цель testCompile — тесты. Плагин подключён по умолчанию, объявлять его нужно, чтобы зафиксировать версию и задать параметры. Главный параметр — release, версия Java, под которую компилируется код; без него действуют значения по умолчанию плагина.

Значения по умолчанию зависят от версии плагина: в старых версиях 3.x source/target по умолчанию были 1.5–1.7 (на JDK 20+ это сразу ошибка Source option 7 is no longer supported), начиная с 3.11.0 — 8. Поэтому проект с record из начала урока и не компилируется. Минимальное исправление — свойство, которое плагин читает сам:

<properties>
    <maven.compiler.release>25</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Почему для Java 9+ используют release, а не пару source/target, разобрано на примере в уроке Что такое Maven. Если старый пример предлагает <source>1.9</source>, это вдвойне устарело: начиная с Java 9 версии пишутся без «1.» (9, 17, 25), и вместо пары source/target нужен release.

Полное объявление плагина нужно, когда кроме версии Java требуются другие параметры, например аргументы компилятора или процессор аннотаций Lombok:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.14.0</version>
    <configuration>
        <release>25</release>
        <compilerArgs>
            <arg>-parameters</arg>
            <arg>-Xlint:all</arg>
        </compilerArgs>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.40</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
Параметр User property Что задаёт Если не указать
release maven.compiler.release Версию Java: язык, байткод и доступный API JDK Используются source/target по умолчанию (8 в плагине 3.11.0+)
source, target maven.compiler.source, maven.compiler.target Версию языка и версию байткода (без ограничения API) Зависит от версии плагина
encoding project.build.sourceEncoding (значение по умолчанию) Кодировку исходников Платформенная кодировка и предупреждение (в Maven 3.9.x)
compilerArgs — Дополнительные ключи javac: -parameters (имена параметров методов в байткоде, нужно Spring и Jackson), -Xlint:all Нет дополнительных ключей
annotationProcessorPaths — Процессоры аннотаций (Lombok, MapStruct), которые запускаются при компиляции Начиная с JDK 23 процессоры из classpath по умолчанию не запускаются

Какую версию плагина Maven использует на самом деле, видно в выводе сборки: строка --- compiler:3.13.0:compile (default-compile) @ shop --- содержит и версию, и цель. Как Lombok подключается как зависимость со scope provided, описано в уроке Зависимости в Maven.

Исполняемый jar и Javadoc

Чтобы jar запускался командой java -jar, в его манифест нужно записать главный класс: это делает параметр archive/manifest/mainClass плагина maven-jar-plugin. Документацию по коду генерирует maven-javadoc-plugin на основе стандартной утилиты javadoc.

Main-Class в манифесте: maven-jar-plugin

По умолчанию maven-jar-plugin не прописывает главный класс, и java -jar завершается ошибкой no main manifest attribute. Исправление — настройка плагина:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.4.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.examclouds.App</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
mvn package
java -jar target/hello-maven-1.0-SNAPSHOT.jar

Вывод (для класса App из архетипа quickstart):

Hello World!

Такой jar содержит только классы проекта. Если код использует сторонние библиотеки, запуск упадёт с NoClassDefFoundError на первом обращении к ним: зависимости нужно либо передать в classpath, либо собрать «толстый» jar плагином maven-shade-plugin (или spring-boot-maven-plugin в Spring Boot-проекте).

maven-javadoc-plugin

Плагин генерирует HTML-документацию из комментариев /** ... */ утилитой javadoc:

mvn javadoc:javadoc

Куда попадёт результат, зависит от способа запуска: в составе сайта (mvn site) — в каталог target/site/apidocs, а при прямом вызове цели в версиях плагина 3.x — в target/reports/apidocs. Точный путь javadoc печатает в выводе. Цель javadoc:jar собирает -javadoc.jar, который вместе с -sources.jar и подписями maven-gpg-plugin требуется для публикации библиотеки в Maven Central. Начиная с JDK 8 javadoc строго проверяет комментарии (doclint) и останавливается на ошибках вроде неизвестного тега; временно ослабить проверку можно параметром <doclint>none</doclint>, но лучше исправить комментарии.

Проверка кода: Checkstyle, PMD, SpotBugs

Для автоматической проверки качества кода в Maven используют три плагина: maven-checkstyle-plugin проверяет стиль оформления исходников, maven-pmd-plugin ищет подозрительные конструкции и дубликаты кода, spotbugs-maven-plugin анализирует байткод на вероятные ошибки. У каждого есть цель-отчёт и цель check, которая останавливает сборку при нарушениях.

Плагин Что анализирует Отчёт Ломает сборку Пример находки
maven-checkstyle-plugin Исходники: оформление и соглашения checkstyle:checkstyle checkstyle:check Отступы, длина строки, нет Javadoc, «магические числа»
maven-pmd-plugin Исходники: подозрительные конструкции; CPD — дубли pmd:pmd, pmd:cpd pmd:check, pmd:cpd-check Пустой блок catch, неиспользуемая переменная, скопированный метод
spotbugs-maven-plugin Байткод: шаблоны ошибок spotbugs:spotbugs, spotbugs:gui spotbugs:check Возможный NullPointerException, equals без hashCode, незакрытый поток

Цели check всех трёх плагинов по умолчанию привязаны к фазе verify: достаточно добавить их в <executions> без <phase>, и mvn verify на CI будет падать при нарушениях.

maven-checkstyle-plugin и suppressions

Без настройки плагин проверяет код по правилам Sun (sun_checks.xml); второй встроенный набор — google_checks.xml. Отчёт по нарушениям записывается в target/checkstyle-result.xml.

mvn checkstyle:check

Готовые наборы правил редко подходят проекту целиком, поэтому обычно используют свой файл правил или отключают отдельные проверки через файл подавлений (suppressions):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
    </configuration>
</plugin>

Файл checkstyle-suppressions.xml в корне проекта:

<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
        "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
        "https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
    <!-- everywhere -->
    <suppress checks="MagicNumber" files="."/>
    <suppress checks="FinalParameters|HiddenField" files="."/>
    <!-- only in tests -->
    <suppress checks="Javadoc.*" files="[\\/]src[\\/]test[\\/]"/>
    <!-- one generated class -->
    <suppress checks=".*" files="[\\/]generated[\\/].*\.java"/>
</suppressions>

Атрибуты checks и files — регулярные выражения: первый сопоставляется с именем проверки, второй — с путём к файлу. Выражение [\\/] совпадает и с /, и с \, поэтому правило работает в Linux и Windows.

Встроенная версия Checkstyle. Плагин 3.6.0 по умолчанию использует Checkstyle 9.3, который не знает синтаксиса последних версий Java и может не разобрать такой файл. Версию самого Checkstyle повышают зависимостью внутри плагина:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.6.0</version>
    <dependencies>
        <dependency>
            <groupId>com.puppycrawl.tools</groupId>
            <artifactId>checkstyle</artifactId>
            <!-- check the latest version on Maven Central -->
            <version>10.21.4</version>
        </dependency>
    </dependencies>
</plugin>

Это пример общего приёма: <dependencies> внутри <plugin> меняют classpath самого плагина и в classpath приложения не попадают.

Неочевидный момент: google_checks и «зелёная» сборка

Цель checkstyle:check по умолчанию роняет сборку только на нарушениях уровня error (параметр violationSeverity). В google_checks.xml все правила имеют уровень warning, поэтому после переключения на него mvn verify печатает сотни строк [WARN] и завершается BUILD SUCCESS. Чтобы проверка действительно останавливала сборку, задайте <violationSeverity>warning</violationSeverity>, как в примере раздела executions.

maven-pmd-plugin

PMD ищет в исходниках «плохой код»: неиспользуемые переменные и импорты, пустые блоки catch, излишне сложные методы. Входящий в плагин Copy/Paste Detector (CPD) находит дубликаты кода. Плагин работает в двух режимах.

Отчёты. Полезно при первом подключении к существующему проекту, который раньше не использовал эти инструменты: можно оценить масштаб проблем, не ломая сборку.

mvn pmd:pmd
mvn pmd:cpd

Проверка. Если найдено нарушение, сборка останавливается. Цели check и cpd-check сами запускают анализ перед проверкой:

mvn pmd:check
mvn pmd:cpd-check

Объявление в pom.xml с проверкой при mvn verify:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.26.0</version>
    <configuration>
        <!-- CPD: minimum duplicate size in tokens -->
        <minimumTokens>100</minimumTokens>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
                <goal>cpd-check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

spotbugs-maven-plugin вместо findbugs-maven-plugin

SpotBugs ищет в скомпилированных классах шаблоны типичных ошибок: возможное разыменование null, неправильное использование API, ошибки многопоточности. Это преемник FindBugs: последний релиз FindBugs (3.0.1) вышел в 2015 году и не понимает байткод новее Java 8, поэтому findbugs-maven-plugin из старых статей на современных JDK не используют.

<plugin>
    <groupId>com.github.spotbugs</groupId>
    <artifactId>spotbugs-maven-plugin</artifactId>
    <!-- first three numbers = SpotBugs version -->
    <version>4.9.3.0</version>
    <configuration>
        <effort>Max</effort>
        <threshold>Medium</threshold>
    </configuration>
</plugin>
mvn compile spotbugs:check
mvn spotbugs:gui

SpotBugs анализирует байткод, а не исходники, поэтому при вызове из командной строки перед целью нужна компиляция (mvn compile spotbugs:check); при привязке к verify классы уже скомпилированы. Цель spotbugs:gui открывает найденные проблемы в окне с привязкой к строкам кода. Список шаблонов ошибок — в документации SpotBugs.

Версии плагинов и pluginManagement

Версию плагина фиксируют в pom.xml: в <plugin> или централизованно в <build><pluginManagement>. Если версия не указана, для стандартных плагинов её подставляет установленный Maven, и одна и та же сборка на Maven 3.9.0 и 3.9.11 пойдёт с разными плагинами. Фактическую версию показывает лог сборки и mvn help:effective-pom.

Как узнать версию плагина

Способ Что показывает
Строки лога --- prefix:version:goal (execution-id) @ project --- Какая версия реально выполнилась в этой сборке
mvn help:effective-pom Итоговые версии всех плагинов с учётом родителя и Super POM
mvn versions:display-plugin-updates Доступные новые версии и плагины без зафиксированной версии
Страница плагина на Maven Central или maven.apache.org Последний релиз и требования к версии Maven и Java
mvn versions:display-plugin-updates

Вывод (фрагмент; номера зависят от проекта и даты запуска):

[INFO] The following plugin updates are available:
[INFO]   maven-checkstyle-plugin ...................... 3.5.0 -> 3.6.0
[INFO]   maven-compiler-plugin ...................... 3.13.0 -> 3.14.0

pluginManagement

<pluginManagement> задаёт версии и настройки плагинов «на случай использования» и сам по себе плагины не запускает. Обычно его пишут в родительском POM, а модули объявляют плагин в <plugins> уже без версии:

<!-- parent pom.xml -->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <configLocation>google_checks.xml</configLocation>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<!-- module pom.xml: version and configuration come from the parent -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Как устроены родительский POM и effective POM, описано в разделе parent, Super POM и effective POM.

Нюанс: pluginManagement работает не для всех плагинов одинаково

Если maven-checkstyle-plugin с executions объявлен только в pluginManagement, проверка стиля не запустится ни разу, и сборка молча пройдёт. А вот версия и настройки maven-compiler-plugin или maven-surefire-plugin из pluginManagement применяются и без объявления в <plugins>: эти плагины уже используются стандартными привязками жизненного цикла. Правило простое: плагин, которого нет в стандартных привязках, нужно ещё и перечислить в <plugins>.

Подводные камни при настройке плагинов

Большинство ошибок с плагинами Maven не приводят к падению сборки: плагин просто не запускается или работает с другими настройками. В таблице — что сделали, что получили и как исправить.

Что сделали Что произойдёт Как исправить
Не задали версию Java для компилятора Плагин компилирует с source 8 (или 1.5–1.7 в старых версиях): records are not supported in -source 8 или Source option 7 is no longer supported Свойство maven.compiler.release
mvn maven-checkstyle-plugin:check No plugin found for prefix 'maven-checkstyle-plugin' mvn checkstyle:check или полные координаты groupId:artifactId:goal
Плагин с executions объявлен только в pluginManagement Плагин не запускается, сборка проходит Перечислить плагин в <build><plugins>
Настройки положили внутрь <execution> и запускают цель из командной строки Цель выполняется с id default-cli и настройками по умолчанию Перенести <configuration> на уровень <plugin>
Плагин без <version> Предупреждение 'build.plugins.plugin.version' ... is missing; версия зависит от установленного Maven Указать версию в <plugin> или в pluginManagement
google_checks.xml без violationSeverity checkstyle:check выводит предупреждения и завершается BUILD SUCCESS <violationSeverity>warning</violationSeverity>
Новый синтаксис Java с Checkstyle по умолчанию Checkstyle 9.3 из плагина не разбирает файл Добавить в плагин зависимость com.puppycrawl.tools:checkstyle свежей версии
findbugs-maven-plugin в проекте на Java 9+ FindBugs не поддерживает байткод новее Java 8 Заменить на com.github.spotbugs:spotbugs-maven-plugin

Часто задаваемые вопросы

Чем плагин отличается от зависимости в Maven?

Зависимость (<dependencies>) — библиотека, которую использует код приложения: она попадает в classpath компиляции, тестов или запуска. Плагин (<build><plugins>) — инструмент самой сборки: он выполняется внутри Maven и в приложение не попадает. Если плагину нужна дополнительная библиотека, её указывают в <dependencies> внутри <plugin>, как в примере с версией Checkstyle.

Как временно пропустить плагин при сборке?

У большинства плагинов есть параметр skip со своим свойством: mvn verify -Dcheckstyle.skip -Dpmd.skip -Dspotbugs.skip, для тестов — -DskipTests. Чтобы отключить execution, унаследованное от родителя, в модуле повторяют его id с <phase>none</phase>. Имя свойства конкретного плагина показывает mvn help:describe -Dplugin=... -Ddetail.

Как написать собственный плагин Maven?

Создайте проект с packaging = maven-plugin и зависимостями maven-plugin-api и maven-plugin-annotations (scope provided). Каждая цель — класс, наследующий AbstractMojo, с аннотацией @Mojo(name = "...") и методом execute(). Дескриптор плагина при сборке генерирует maven-plugin-plugin. После mvn install цель можно вызвать в другом проекте по координатам. Свой плагин нужен редко: сначала проверьте готовые на maven.apache.org и MojoHaus.

Где Maven хранит скачанные плагины?

Там же, где зависимости, — в локальном репозитории ~/.m2/repository, по пути из groupId, например org/apache/maven/plugins/maven-compiler-plugin/3.14.0/. Плагины скачиваются из репозиториев плагинов (по умолчанию Maven Central) при первом использовании, поэтому первая сборка проекта идёт дольше. Подробнее о локальном и удалённых репозиториях — в уроке Виды репозиториев в Maven.

Практика по теме

Закрепите урок на задачах — у каждой есть уровень и оценка времени.

Все задачи модуля →

Комментарии

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.