Вимкніть плагін Maven, визначений у батьківській POM


158

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

Обмеження: я не можу сам змінити батьківський POM.

Відповіді:


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, тому він успадкує версію та інше.

У Maven 3 вам потрібно буде використовувати:

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

для плагіна.


8
Хоча це "правильно", тобто працює, слід зазначити, що це не визначена (або принаймні незадокументована ) функція. Не існує офіційної фази під назвою "немає". Отже, ви можете також помістити туди "foo".
Marcel Stör

1
Для мене в Maven 3 це не працює. <skip> правда </skip>, як пропонують твори
bmargulies

10
Мені довелося додати <id>…</id>частину батьківського POM, тоді це працювало на мене.
mirabilos

4
Рішення Maven 3 насправді не вимикає плагін, чи не так? За висновком, плагін все ще виконується. Чи поважає він тоді конфігурацію пропуску та як / що він вирішив пропустити, схоже, на окремий плагін.
Zero3

10
Коментар mirabilos є правильним рішенням для Maven 3 і є портативним у всіх плагінах. Не всі плагіни мають <skip>параметр.
Гілі

60

Перевірте, чи має плагін параметр конфігурації "пропустити". Майже всі це роблять. якщо це так, просто додайте його до декларації у дитини:

<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

1
Також слідкуйте за плагінами та плагінами. Пізніший перекриває перший.
bmargulies

Я використовую плагін Cobertura і не хочу запускати його в дитячій пом.
tobiasbayer

Мета перевірки має пропуск у 2,5. Це не було раніше. Цілі кобертури немає.
bmargulies

Я не хочу пропускати лише чек, але й ціле виконання плагіна.
tobiasbayer

37

Нитка стара, але, можливо, хтось все-таки цікавиться. Найкоротша форма, яку я знайшов, - це подальше вдосконалення на прикладі λlex та bmargulies. Тег виконання буде виглядати так:

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

2 бали, які я хочу виділити:

  1. фаза встановлена ​​нанівець, що виглядає менш хакітно, ніж «ніхто», хоча все-таки хак.
  2. ідентифікатор повинен бути таким же, як і виконання, яке ви хочете змінити. Якщо ви не вкажете ідентифікатор для виконання, Maven зробить це неявно (таким чином, який не очікується вами інтуїтивно).

Після публікації повідомлення виявлено, що він уже знаходиться в потоковому потоці: У мультимодульному проекті Maven, як я можу відключити плагін у однієї дитини?


1
Для запису: ідентифікатори виконання по замовчуванням слідувати простим правилам , які викладені в цій відповіді: stackoverflow.com/a/34599117/7641
Jens Bannmann

2
Варто зазначити, що це рішення фактично вимикає (як вимагав ОП) плагін (для даного ідентифікатора виконання) замість того, щоб покладатися на специфічну для плагіна опцію "пропустити".
Zero3

3

Я знаю, що ця тема справді стара, але рішення від Івана Бондаренка допомогло мені в моїй ситуації.

Я мав такий на мою 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.