Отключить плагин Maven, определенный в родительском POM

158

Я использую родительский POM, который определяет плагин, который я не хочу запускать в дочернем POM. Как полностью отключить плагин в дочернем помпе?

Ограничение: Я не могу изменить сам родительский POM.

tobiasbayer
источник

Ответы:

205

Следующее работает для меня при отключении Findbugs в дочернем POM:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>ID_AS_IN_PARENT</id> <!-- id is necessary sometimes -->
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

Примечание: полное определение плагина Findbugs находится в нашем POM родительского / супер POM, поэтому он унаследует версию и так далее.

В Maven 3 вам нужно будет использовать:

 <configuration>
      <skip>true</skip>
 </configuration>

для плагина.

Alex
источник
8
Хотя это «правильно», то есть работает, следует отметить, что это неуказанная (или, по крайней мере, недокументированная ) функция. Там нет официального этапа под названием «нет». Таким образом, вы могли бы также поставить 'Foo' там.
Марсель Стёр
1
Для меня в Maven 3 это не работает. <skip> true </ skip> как bmargulies предложил работы
mibutec
10
Я должен был добавить <id>…</id>часть родительского POM, тогда это работало для меня.
Мирабилось
4
Решение Maven 3 на самом деле не отключает плагин, правда? Согласно выводу, плагин все еще выполняется. Соблюдает ли он тогда конфигурацию пропуска и как / что он выбирает пропустить, кажется, зависит от отдельного плагина.
Ноль3
10
Комментарий mirabilos является правильным решением для Maven 3 и переносим для всех плагинов. Не все плагины имеют <skip>параметр.
Гили
60

Посмотрите, есть ли у плагина параметр конфигурации 'skip'. Почти все делают. если это так, просто добавьте его в объявление в дочернем элементе:

<plugin>
   <groupId>group</groupId>
   <artifactId>artifact</artifactId>
   <configuration>
     <skip>true</skip>
   </configuration>
</plugin>

Если нет, то используйте:

<plugin>    
<groupId>group</groupId>   
 <artifactId>artifact</artifactId>    
<executions>
     <execution>
       <id>TheNameOfTheRelevantExecution</id>
       <phase>none</phase>
     </execution>    
</executions>  
</plugin>
bmargulies
источник
Как насчет того, чтобы назвать плагин, с которым вы работаете, и запустить help :ffective-pom, чтобы увидеть, действительно ли вы выполняете правильно.
Bmargulies
1
Также обратите внимание на плагины и управление плагинами. Позднее переопределяет первое.
Bmargulies
Я использую плагин Cobertura, и я не хочу запускать его в детской помпе.
Тобиасбайер
Цель проверки имеет пропуск в 2.5. Это не раньше. Цель cobertura не делает.
bmargulies
Я не хочу пропустить только проверку, но все выполнение плагина.
Тобиасбайер
37

Нить старая, но может кто-то еще заинтересовался. Самая короткая форма, которую я нашел, - это дальнейшее улучшение на примере из λlex и bmargulies. Тег выполнения будет выглядеть так:

<execution>
    <id>TheNameOfTheRelevantExecution</id>
    <phase/>
</execution>

2 балла, которые я хочу выделить:

  1. Фаза установлена ​​в ничто, что выглядит менее взломанным, чем «нет», хотя все еще является взломом.
  2. id должен совпадать с исполнением, которое вы хотите переопределить. Если вы не укажете id для выполнения, Maven сделает это неявно (таким образом, вы не ожидаете этого интуитивно).

После публикации обнаружил, что он уже находится в stackoverflow: в многомодульном проекте Maven, как я могу отключить плагин в одном дочернем элементе?

Иван Бондаренко
источник
1
Для записи: идентификаторы выполнения по умолчанию следуют простым правилам, изложенным в этом ответе: stackoverflow.com/a/34599117/7641
Йенс Баннманн
2
Стоит отметить, что это решение фактически отключает (как запросил OP) плагин (для заданного идентификатора выполнения) вместо того, чтобы полагаться на специфичную для плагина опцию «пропустить».
Zero3
3

Я знаю, что эта ветка действительно старая, но решение от @Ivan Bondarenko помогло мне в моей ситуации.

У меня было следующее в моем pom.xml.

<build>
    ...
    <plugins>
         <plugin>
                <groupId>com.consol.citrus</groupId>
                <artifactId>citrus-remote-maven-plugin</artifactId>
                <version>${citrus.version}</version>
                <executions>
                    <execution>
                        <id>generate-citrus-war</id>
                        <goals>
                            <goal>test-war</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    </plugins>
</build>

То, что я хотел, было отключить выполнение generate-citrus-warдля определенного профиля, и это было решение:

<profile>
    <id>it</id>
    <build>
        <plugins>
            <plugin>
                <groupId>com.consol.citrus</groupId>
                <artifactId>citrus-remote-maven-plugin</artifactId>
                <version>${citrus.version}</version>
                <executions>
                    <!-- disable generating the war for this profile -->
                    <execution>
                        <id>generate-citrus-war</id>
                        <phase/>
                    </execution>

                    <!-- do something else -->
                    <execution>
                        ...
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>
Ливиу Илеа
источник