Выполнить цель плагина Maven на дочерних модулях, но не на родительских - PullRequest
59 голосов
/ 26 октября 2009

В многомодульном проекте, как вы можете указать, что вы хотите выполнить цель плагина во всех дочерних модулях, но не в родительском проекте? Существует <pluginManagement>, но это только определяет конфигурацию для выполнения - дочерние модули все равно должны будут ссылаться на плагин для выполнения цели:

[...] Однако, это настраивает только те плагины, на которые действительно ссылаются в элементе плагина в дочерних элементах. ( POM Reference )

Есть ли другой способ добиться этого?

ОБНОВЛЕНИЕ: Я пробовал это по совету Паскаля:

<!-- ... -->
<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.

Ответы [ 6 ]

26 голосов
/ 26 октября 2009

В соответствии с привязками по умолчанию жизненного цикла , привязки для упаковки pom:

Привязки жизненного цикла по умолчанию - Упаковка П

package       site:attach-descriptor  
install       install:install  
deploy        deploy:deploy

Так что, если у вашего родительского POM есть <packaging>pom<packaging> (это должно быть так, как указано в комментарии), и если вы связываете свои плагины с фазами, отличными от указанных выше (см. Lifecycle Reference для полный список), они не будут выполняться во время сборки родительского POM.

(РЕДАКТИРОВАТЬ: Мой первоначальный ответ просто неправильный. Если вы привязываете цель плагина к определенной фазе, она будет запущена на этой фазе, независимо от упаковки проекта. По умолчанию привязки жизненного цикла не имеют к этому никакого отношения, это просто привязки жизненного цикла по умолчанию. Все, что имеет значение, это то, что фаза, к которой привязан плагин, является частью build lifecyle .)

Как вы указали, вы можете использовать pluginManagement в родительском pom для конфигурации плагина, но если вы действительно хотите выполнить цель плагина в дочерних модулях, а not в родительском (у вас могут быть веские причины для этого, но в большинстве случаев плагины не будут иметь большого эффекта на модуле с упаковкой 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>
17 голосов
/ 10 марта 2011

Описанное решение с управлением плагинами, безусловно, правильно, но в некоторых случаях оно не подходит. Предположим, вы хотите запустить несколько целей jar: jar в дочернем модуле, каждый из которых настроен со своими собственными настройками (конфигурацией) для каждого выполнения. Или вообще, когда вы не хотите, чтобы дочерние poms явно запускали плагин (ы).

В этом случае решение, которое работало для меня, состояло в том, чтобы определить выполнение в родительском pom под определенным профилем и активировать его только в дочерних poms, например, путем проверки существования некоторого файла или свойства:

<profile>
    <id>generate-dc</id>
    <activation>
        <file>
            <exists>src/main/assembly/some.xml</exists>
        </file>
    </activation>

Тогда плагины не будут выполняться в родительском объекте, но будут выполняться во всех дочерних элементах, если они содержат файл, или задают какое-либо свойство.

9 голосов
/ 04 мая 2012

У меня было аналогичное требование для запуска некоторых плагинов в дочернем, но не в родительском POM. я достиг этого, заявив <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> 

Элемент pom дочернего проекта ниже

<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>
1 голос
/ 27 октября 2016

Этот конфиг ниже работал для меня. Добавьте плагин в родительский и дочерний пом.

Родитель:

<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>

Child

<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>
1 голос
/ 06 мая 2016

Используйте <inherited>false</inherited> в разделе плагинов в родительском проекте.

Пожалуйста, обратитесь к этой странице для получения дополнительной информации.

0 голосов
/ 01 апреля 2015

Я попробовал ответ от Паскаля, но он не работал для меня. Плагины, на которые есть ссылки в дочернем pom, не выполнялись, я предполагаю, потому что у них не было привязки фазы сборки.

В этом посте описано решение, которое работает путем привязки плагинов к идентификаторам выполнения и фазам сборки: Как переопределить привязку по умолчанию к фазе плагина Maven

Я бы порекомендовал всем, кто пытается заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...