В многомодульном проекте 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.
- Сначала установите фазу выполнения в
none
- Создайте другое исполнение, дайте ему
id
и делай в нем то, что тебе нужно. - бежать
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
выполняет - это то, что я хотел достичь.