В многомодульном проекте Maven как отключить плагин у одного ребенка?

У меня есть мультимодульный проект Maven (парень, я слишком много раз писал об этом открытии на этом сайте). Почти все модули (то есть те, в которых есть код) должны запускать плагин maven-site-plugin для генерации отчетов о покрытии кода и т. Д. Они имеют подробную общую конфигурацию - какие отчеты нужно запускать, какие файлы для покрытия / исключить для определенных плагинов и т. д.

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

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

Это то, что я хочу - общая конфигурация для плагина, который иногда отключается дочерним модулем - даже возможно? Если так, то как?

2 ответа

Решение

Под "запуском плагина" я предполагаю, что вы имеете в виду, что плагин связан с фазой жизненного цикла, и вы хотите отменить его привязку в некоторых модулях. Во-первых, вы можете рассмотреть возможность изменения наследования POM, чтобы модули, которым не нужны плагины, имели одного родителя, а модули, у которых действительно есть родительский модуль. Если вы не хотите этого делать, тогда вы можете явно установить фазу выполнения в "ничего" в дочернем модуле. Например, если у вас была родительская конфигурация pom, например:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase>initialize</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                ... lots of configuration
            </configuration>
        </execution>
    </executions>
</plugin>

Затем в дочернем модуле вы можете сделать это:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase/>
        </execution>
    </executions>
</plugin>

Поскольку это тот же плагин и тот же идентификатор выполнения, он переопределяет конфигурацию, указанную в родительском элементе, и теперь плагин не привязан к фазе в дочернем проекте.

Ответ Райана Стюарта работает, если выполнение, которое вы хотите подавить в родительском помпе, помечено id, Однако, если родительский pom не помечает выполнение с помощью id (и, конечно, вы не можете редактировать этот родительский pom), тогда я обнаружил, что выполнение следующего подавляет действие родительского pom.

  1. Сначала установите фазу выполнения в none
  2. Создайте другое исполнение, дайте ему id и делай в нем то, что тебе нужно.
  3. бежать mvn help:effective-pom чтобы убедиться, что он правильно подавил то, что вам нужно, подавил родительский пом.

Вот пример: Вот как выглядел мой родительский пом:

    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.1.2</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
      <inherited>true</inherited>
    </plugin>

Мне нужно было изменить цель на jar-no-fork, Обратите внимание, что выполнение в родительском пом не имеет id что я мог бы использовать, чтобы отключить его. Итак, вот что добавилось к моему детскому пому:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

В результате вот как выглядит эффективный пом:

      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.2.1</version>
        <executions>
          <execution>
            <phase>none</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
        </executions>
        <inherited>true</inherited>
        <configuration>
          <archive>
            <compress>false</compress>
          </archive>
        </configuration>
      </plugin>

Это гарантировало, что цель jar никогда не бежит и только цель jar-no-fork выполняет - это то, что я хотел достичь.

Другие вопросы по тегам