Подтвердить что ты не робот

Выполнение цели плагина 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.

4b9b3361

Ответ 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>