1. Обзор
Apache Maven — это мощный инструмент, который использует подключаемые модули для автоматизации и выполнения всех задач сборки и создания отчетов в проекте Java.
Однако, скорее всего, в сборке будет использоваться несколько таких плагинов вместе с разными версиями и конфигурациями, особенно в многомодульном проекте . Это может привести к проблемам со сложными файлами POM с избыточными или повторяющимися артефактами плагинов, а также с конфигурациями, разбросанными по различным дочерним проектам.
В этой статье мы увидим, как использовать механизм управления плагинами Maven для решения таких проблем и эффективного обслуживания плагинов во всем проекте.
2. Конфигурация плагина
Maven имеет два типа плагинов:
- Build — выполняется в процессе сборки. Примеры включают плагины Clean, Install и Surefire. Они должны быть настроены в разделе
сборки
POM. - Отчетность — выполняется во время создания сайта для создания различных отчетов по проекту. Примеры включают подключаемые модули Javadoc и Checkstyle. Они настраиваются в разделе
отчетности
POM проекта.
Плагины Maven предоставляют все полезные функции, необходимые для выполнения и управления сборкой проекта.
Например, мы можем объявить плагин Jar в POM:
<build>
....
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
....
</plugin>
....
</plugins>
</build>
Здесь мы включили плагин в раздел сборки
, чтобы добавить возможность компилировать наш проект в банку
.
3. Управление плагинами
В дополнение к plugins
мы также можем объявить плагины в разделе pluginManagement
POM. Он содержит элементы плагина
почти так же, как мы видели ранее. Однако при добавлении плагина в раздел pluginManagement
он становится доступным для этого POM и всех наследующих дочерних POM .
Это означает, что любые дочерние POM будут наследовать исполнения плагина, просто ссылаясь на плагин в своем разделе плагинов .
Все, что нам нужно сделать, это добавить соответствующие groupId
и артефакты
без необходимости дублировать конфигурацию или управлять версией.
Подобно механизму управления зависимостями , это особенно полезно в многомодульных проектах, поскольку обеспечивает централизованное управление версиями плагинов и любой связанной конфигурацией.
4. Пример
Начнем с создания простого многомодульного проекта с двумя подмодулями. Мы включим подключаемый модуль Build Helper в родительский POM, который содержит несколько небольших целей, помогающих в жизненном цикле сборки. В нашем примере мы будем использовать его для копирования некоторых дополнительных ресурсов в выходные данные проекта для дочернего проекта.
4.1. Конфигурация родительского POM
Во-первых, мы добавим плагин в раздел pluginManagement
родительского POM:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/resources</directory>
<targetPath>json</targetPath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
Это связывает цель добавления ресурсов
плагина с фазой генерации ресурсов в
жизненном цикле POM по умолчанию . Мы также указали каталог src/resources
, содержащий дополнительные ресурсы. Выполнение плагина скопирует эти ресурсы в целевое расположение в выходных данных проекта по мере необходимости.
Затем давайте запустим команду maven, чтобы убедиться, что конфигурация действительна и сборка прошла успешно:
$ mvn clean test
После выполнения этого целевое расположение еще не содержит ожидаемых ресурсов.
4.2. Конфигурация дочернего POM
Теперь давайте сошлемся на этот плагин из дочернего POM:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Как и в случае с управлением зависимостями, мы не объявляем версию или конфигурацию плагина. Вместо этого дочерние проекты наследуют эти значения из объявления в родительском POM.
Наконец, давайте снова запустим сборку и посмотрим на результат:
....
[INFO] --- build-helper-maven-plugin:3.3.0:add-resource (add-resource) @ submodule-1 ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ submodule-1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource to json
....
Здесь плагин выполняется во время сборки, но только в дочернем проекте с соответствующим объявлением. В результате выходные данные проекта теперь содержат дополнительные ресурсы из указанного местоположения проекта, как и ожидалось.
Следует отметить, что только родительский POM содержит объявление и конфигурацию плагина, в то время как дочерние проекты просто ссылаются на них по мере необходимости.
Дочерние проекты могут свободно изменять унаследованную конфигурацию , если это необходимо.
5. Основные плагины
Есть несколько основных плагинов Maven , которые по умолчанию используются как часть жизненного цикла сборки. Например, плагины очистки
и компилятора
не нужно объявлять явно.
Однако мы можем явно объявить и настроить их в элементе pluginManagement
в POM. Основное отличие состоит в том, что конфигурация основного плагина вступает в силу автоматически без какой-либо ссылки в дочерних проектах .
Давайте попробуем это, добавив плагин компилятора в знакомый раздел
pluginManagement
:
<pluginManagement>
....
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
....
</pluginManagement>
Здесь мы заблокировали версию плагина и настроили ее для использования Java 8 для сборки проекта. Однако в дочерних проектах не требуется дополнительного объявления подключаемого модуля .
Платформа сборки активирует эту конфигурацию по умолчанию. Следовательно, эта конфигурация означает, что сборка должна использовать Java 8 для компиляции этого проекта во всех модулях.
В целом, может быть хорошей практикой явно объявлять конфигурацию и блокировать версии для любых подключаемых модулей, необходимых в многомодульном проекте . Следовательно, разные дочерние проекты могут наследовать только необходимые конфигурации подключаемых модулей от родительского POM и применять их по мере необходимости.
Это устраняет повторяющиеся объявления, упрощает файлы POM и улучшает воспроизводимость сборки.
6. Заключение
В этой статье мы увидели, как централизовать подключаемые модули Maven, необходимые для создания проекта, и управлять ими.
Сначала мы рассмотрели плагины и их использование в проекте POM. Затем мы более подробно рассмотрели механизм управления плагинами Maven и то, как это помогает уменьшить дублирование и повысить удобство сопровождения конфигурации сборки.
Как всегда, код примера доступен на GitHub .