Автоматически активировать родительский плагин в Maven
-
20-08-2019 - |
Вопрос
Возможно ли, чтобы в родительском POM был определен плагин, который был деактивирован, и когда дочерний элемент наследует этот плагин, он автоматически активируется?
Решение
Я думаю, вы хотите настроить плагин в родительском pom, но использовать его только в унаследованных проектах.В Maven есть раздел для этого: настройте свои плагины в PluginManagement, но привязывайте их к фазе только тогда, когда вам это нужно, например.опустите тег фазы в pluginManagement, но укажите его в унаследованном вами pom.
Другие советы
Итак, «сиддхадев» совершенно правильный.Вы можете определить конфигурацию плагина в родительском pom с заданным идентификатором:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>child-caller</id>
<!-- 'phase' omitted -->
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="called from child!" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
И в дочернем POM вы можете явно указать фазу, на которой это должно быть вызвано:
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>child-caller</id>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
Я использовал это для ориентации на различные JRE.К сожалению, поскольку вы не можете использовать плагин maven-compiler-plugin с разными каталогами назначения (что я считаю ошибкой в плагине), вы должны использовать Ant.
Это не совсем то, что вам нужно, но я думаю, что это вам подойдет.
Если вы объявите плагин в теге pluginManagement в родительском проекте, конфигурация будет унаследована всеми дочерними проектами, которые объявляют этот плагин.
Например, в родительском элементе объявите, что плагин компиляции использует Java 5 для тестовой компиляции.
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
Затем в дочернем элементе вы просто объявляете плагин компилятора, и конфигурация от родителя будет унаследована:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
Вы можете объявить плагин на верхнем уровне pom и указать его пропускать, а затем запретить его пропускать на дочернем уровне.Это не совсем автоматически, но уровень детализации переопределения очень минимален.
Родительский Pom, отключающий плагин, но объявляющий весь конфиг:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>true</skip>
...lots more config...
...lots more config...
...lots more config...
</configuration>
</plugin>
Child Pom, включение плагина:
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
Я пошел со следующим решением:
Настройте плагин в родительском поме в разделе PluginManagement.Привяжите плагин к существующей фазе.
Деактивируйте плагин для родительского пома, привязав его к несуществующей фазе:Переопределите фазу в разделе плагинов.
Активируйте плагин в каждом дочернем ПО, включив его в раздел плагинов.
Пример родительского помпона:
<defaultGoal>install</defaultGoal>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-ejb-client</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${ejb-client-file}</file>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
<classifier>client</classifier>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</pluginManagement>
<plugins>
<plugin>
<!-- deactivate the plugin for this project, only child-projects do generate ejb-clients -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>install-ejb-client</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
Пример дочернего помпона:
<build>
<plugins>
...
<plugin>
<!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
</plugin>
...
</plugins>
</build>
Насколько я знаю, универсального решения для этой проблемы не существует.По крайней мере на данный момент...
Одна из идей (я не пробовал, но она может сработать) состоит в том, чтобы определить в родительском pom.xml несуществующую цель выполнения, например:
<executions>
<execution>
<goals>
<goal>noGoal</goal>
</goals>
</execution>
</executions>
и в каждом ребенке вы определяете правильную цель.
Проблема этого решения (если оно, конечно, работает ;)) заключается в том, что вы должны переопределить конфигурацию плагина для каждого дочернего элемента.В противном случае оно не будет выполнено.