Плагины 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выполняется с iddefault-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.
Практика по теме
Закрепите урок на задачах — у каждой есть уровень и оценка времени.
Все задачи модуля →
Комментарии