В многомодульном проекте Maven как отключить плагин у одного ребенка? - PullRequest
40 голосов
/ 18 октября 2011

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

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

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

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

Ответы [ 2 ]

71 голосов
/ 18 октября 2011

Под «запуском плагина» я предполагаю, что вы имеете в виду, что плагин связан с фазой жизненного цикла, и вы хотите отменить его привязку в некоторых модулях.Во-первых, вы можете рассмотреть возможность изменения наследования 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>

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

2 голосов
/ 15 августа 2017

Ответ Райана Стюарта работает, если выполнение, которое вы хотите подавить в родительском помпе, помечено 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. Обратите внимание, что выполнение в родительском pom не имеет 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 будет выполнена - это то, чего я хотел достичь.

...