Выполнение цели плагина Maven для дочерних модулей, но не для родительских
В многомодульном проекте, как вы можете указать, что вы хотите выполнить цель плагина во всех дочерних модулях, но не в родительском проекте? Существует <pluginManagement>
, но это определяет только конфигурацию для выполнения - дочерние модули все равно должны ссылаться на плагин, чтобы выполнить цель:
[...] Тем не менее, это только настраивает плагины, которые на самом деле ссылаются на элемент плагинов в дочерних элементах. (Ссылка POM)
Любой другой способ достичь этого?
ОБНОВЛЕНИЕ: Я пробовал это по совету Паскаля:
<!-- ... -->
<packaging>pom</packaging>
<modules>
<module>child</module>
</modules>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- ... -->
Это все равно будет генерировать .jar для родительского проекта, даже если цель jar
привязана к фазе integration-test
.
Ответы
Ответ 1
В соответствии с привязкой по умолчанию Lifecycle привязки для упаковки pom
:
Связывание по умолчанию Lifecycle - упаковка П
package site:attach-descriptor
install install:install
deploy deploy:deploy
Итак, если ваш родительский POM имеет <packaging>pom<packaging>
(это должно быть так, как указано в комментарии), и если вы привязываете свои плагины к другим этапам, чем предыдущие (см. Справочник по жизненному циклу для полного списка), они не будут выполняться во время сборки родительского POM.
Забастовкa >
(EDIT: мой первоначальный ответ неверен. Если вы привяжете цель плагина к определенной фазе, она будет запущена на этом этапе, независимо от упаковки проекта. Привязки по умолчанию Lifecycle не имеют к этому никакого отношения, они просто привязаны к жизненным циклам по умолчанию. Все, что имеет значение, - это то, что фаза, на которую плагин привязан, является частью построить lifecyle.)
Как вы указали, вы можете использовать pluginManagement
в родительском помпе для конфигурации плагина, но если вы действительно хотите выполнить плагиновую цель в дочерних модулях и не в родительском (у вас могут быть веские причины для этого, но большую часть времени плагины не будут иметь большого эффекта в модуле с упаковкой pom
, которая не имеет никакого контента), вам придется ссылаться на плагины в элементе plugins
у детей.
Применительно к вашему примеру родительский pom.xml может определить следующие спецификации:
<project>
<packaging>pom</packaging>
...
<modules>
<module>child</module>
</modules>
...
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>my-execution-id</id>
<phase>integration-test</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</pluginManagement>
</build>
...
</project>
И в каждом дочернем pom.xml
требуется только следующее:
<project>
...
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
...
</build>
</project>
Ответ 2
Описанное решение с управлением плагинами, конечно, правильно, но в некоторых случаях оно не подходит. Предположим, вы хотите запустить несколько jar: jar целей в дочернем модуле, каждый из которых настроен с собственными настройками (конфигурацией) на выполнение. Или вообще, когда вы не хотите принуждать детей-понтов к явному запуску плагина (-ов).
В этом случае решение, которое сработало для меня, заключалось в том, чтобы определить выполнение в родительском pom под определенным профилем и активировать его только в дочерних помпах, например, путем проверки наличия какого-либо файла или свойства:
<profile>
<id>generate-dc</id>
<activation>
<file>
<exists>src/main/assembly/some.xml</exists>
</file>
</activation>
Затем плагины не будут выполняться в родительском объекте, но будут выполняться во всех дочерних, если они содержат файл или задают некоторое свойство.
Ответ 3
У меня было аналогичное требование запуска некоторых плагинов в дочернем, но не родительского ПОМ. я достиг этого, указав <skip>true</skip>
в родительском POM.
Запись родительского помпы ниже:
<plugin>
<groupId>eviware</groupId>
<artifactId>maven-soapui-plugin</artifactId>
<version>4.0.0</version>
<inherited>false</inherited>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
</dependencies>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
Запись дочернего проекта ниже
<plugins>
<plugin>
<groupId>eviware</groupId>
<artifactId>maven-soapui-plugin</artifactId>
<version>4.0.0</version>
<configuration>
<settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile>
<projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile>
<outputFolder>site-service-web/target/surefire-reports</outputFolder>
<junitReport>true</junitReport>
<exportwAll>true</exportwAll>
<printReport>true</printReport>
</configuration>
</plugin>
</plugins>
Ответ 4
Я попробовал ответить от Паскаля, но это не сработало для меня. Плагины, на которые ссылаются в дочернем помпе, не выполнялись, я предполагаю, потому что у них не было привязки фазы сборки.
Здесь описывается решение, которое работает, связывая плагины с этапами и этапами сборки: Как переопределить привязку по умолчанию к фазе плагина Maven
Я бы рекомендовал, чтобы кто-то еще пытался заставить это работать.
Ответ 5
Используйте <inherited>false</inherited>
в разделе плагинов в родительском проекте.
Для получения дополнительной информации см. эту страницу.
Ответ 6
Эта ниже конфигурация работала для меня. Добавьте плагин как в родительском, так и в дочернем помпе.
Родитель:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
Ребенок
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>