1. Обзор
Maven позволяет нам построить проект, используя концепцию наследования. Когда родительский POM определяет плагин, все дочерние модули наследуют его.
Но что произойдет, если мы не хотим наследовать плагин от родительского POM и не можем изменить родительский POM?
В этом руководстве мы рассмотрим несколько различных подходов к отключению подключаемого модуля Maven, в частности подключаемого модуля Maven Enforcer , определенного в родительском POM.
2. Когда мы отключим плагин, определенный в родительском POM?
Прежде чем идти дальше, давайте подумаем, зачем нам это может понадобиться.
Maven предпочитает соглашение конфигурации . Мы должны помнить, что хотя отключение плагина может быть самым быстрым решением для нас, это может быть не лучшим решением для проекта.
Необходимость отключения плагина в родительском POM может возникнуть, когда первоначальный автор проекта Maven не предвидел нашей ситуации, и у нас нет возможности самостоятельно внести изменения в родительский модуль.
Допустим, первоначальный автор предполагал, что конкретный файл должен существовать всегда. Однако нашему модулю не имеет смысла иметь этот файл. Например, родительский POM может обеспечить наличие файла лицензии в каждом модуле, которого у нас нет. Вместо того, чтобы добавлять пустой файл, что может сбивать с толку, мы хотим отключить применение правил.
Давайте настроим этот сценарий, добавив родительский модуль в наш проект Maven, который реализует maven-enforcer-plugin
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0</version>
</plugin>
Затем давайте добавим выполнение в плагин, чтобы применить правило, согласно которому файл с именем file-that-must-exist.txt должен существовать в каталоге
src
каждого модуля :
<executions>
<execution>
<id>enforce-file-exists</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireFilesExist>
<files>
<file>${project.basedir}/src/file-that-must-exist.txt</file>
</files>
</requireFilesExist>
</rules>
</configuration>
</execution>
</executions>
Если файл-который-должен-существовать.txt
не существует, сборка завершится ошибкой.
Поскольку дочерние модули наследуют плагины от своих родителей, все дочерние модули должны соблюдать это правило.
Давайте рассмотрим несколько способов отключения этого правила в нашем дочернем POM.
3. Как отключить плагин, определенный в родительском POM?
Во-первых, давайте предположим, что реструктуризация проекта Maven или изменение родительского POM не являются приемлемыми решениями. Если бы мы могли изменить родительский модуль, мы могли бы решить эту проблему, реализовав раздел pluginManagement
в родительском POM.
Возможно, мы не сможем изменить родительский модуль, потому что мы не владеем проектом, поэтому мы не уполномочены вносить изменения за пределами нашего модуля. Это может быть связано с нехваткой времени — реструктуризация проекта требует времени, поэтому удобнее отключить плагин в дочернем модуле.
Далее, мы собираемся предположить, что плагин действительно нужно отключить. Многие плагины будут работать без проблем, даже на модулях, для которых они не предназначены.
Например, предположим, что у нас есть плагин, который копирует файлы Java. Если у нас есть дочерний проект без файлов Java, то плагин, скорее всего, просто не скопирует никаких файлов. Он сделает это без проблем. В этом случае проще и традиционнее оставить плагин работающим.
Предположим, что после рассмотрения вышеизложенного нам обязательно нужно отключить плагин с нашим модулем.
Один из способов сделать это — настроить параметр пропуска
.
3.1. Настройте параметр пропуска
Многие плагины имеют параметр пропуска
. Мы можем использовать параметр skip
, чтобы отключить плагин.
Если мы посмотрим на документацию для maven-enforcer-plugin
, мы увидим, что у него есть параметр пропуска
, который мы можем реализовать.
Поддержка параметра skip
должна быть первой вещью, которую мы проверяем, потому что это самое простое и обычное решение.
Давайте добавим пустой дочерний модуль, содержащий только POM. Если мы соберем модуль с помощью команды mvn clean install
, мы увидим, что сборка не удалась. Это связано с тем, что файл-который-должен-существовать.txt
не существует в нашем модуле, что было необходимо из-за наследования правила от нашего родительского модуля.
Давайте добавим следующие строки в дочерний POM, чтобы включить параметр пропуска
:
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
Теперь, если мы запустим проект, мы увидим, что сборка прошла успешно.
Однако не все плагины будут иметь параметр пропуска
. Итак, если мы используем плагин, у которого его нет, что мы можем сделать вместо этого?
3.2. Удалить фазовый
параметр
Цель Maven запускается только тогда, когда она привязана к фазе сборки.
В нашем родительском POM мы настроили цель принудительного выполнения для запуска с идентификатором принудительного-файла-существования
.
Поскольку мы не указали фазовый
параметр для force-file-exists
, для принудительной цели будет использоваться значение по умолчанию. Из документации видно , что по умолчанию используется фаза проверки
сборки.
Мы можем выполнить цель на альтернативной фазе сборки, указав альтернативное значение для параметра фазы
.
Используя это в наших интересах, мы можем установить для параметра фазы
значение, которого не существует. Это означает, что этап сборки никогда не будет выполнен. Таким образом, цель не будет достигнута, что фактически отключит плагин:
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-file-exists</id>
<phase>any-value-that-is-not-a-phase</phase>
</execution>
</executions>
</plugin>
Чтобы сделать это понятным для тех, кто позже посмотрит наш код, мы хотели бы установить для фазы
ясное имя, такое как «none» или «null».
Однако, возможно, самым простым способом сделать это было бы полностью очистить параметр фазы
:
<execution>
<id>enforce-file-exists</id>
<phase/>
</execution>
Поскольку пустая фаза
выполнения теперь пуста, цель не будет привязана к выполняемой фазе сборки. Это эффективно отключает плагин.
Мы видим, что когда мы запускаем сборку, force-file-exists
вообще не запускается для нашего дочернего модуля.
4. Вывод
В этой статье мы обсудили, почему мы можем отключить плагин, определенный в родительском POM. Мы видели, что отключение плагина не всегда может быть лучшим решением, поскольку Maven предпочитает соглашение, а не настройку.
Затем мы рассмотрели простой пример, в котором мы отключили плагин maven-enforcer,
объявленный родительским POM.
Во- первых, мы продемонстрировали, что можем настроить параметр пропуска
плагина, если он у него есть. Мы обнаружили, что это был наиболее традиционный подход.
Наконец, мы узнали, что очистка параметра фазы
для плагина фактически отключит его.
Как всегда, пример проекта доступен на GitHub .