禁用父 POM 中定义的 Maven 插件
Posted
技术标签:
【中文标题】禁用父 POM 中定义的 Maven 插件【英文标题】:Disable a Maven plugin defined in a parent POM 【发布时间】:2011-12-10 21:24:43 【问题描述】:我正在使用一个父 POM,它定义了一个我不想在子 POM 中运行的插件。如何完全禁用子 pom 中的插件?
约束:我无法更改父 POM 本身。
【问题讨论】:
【参考方案1】:在子 POM 中禁用 Findbugs 时,以下对我有用:
<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>
插件。
【讨论】:
虽然这是“正确的”,即它可以工作,但应该注意它是一个未指定(或至少 未记录)的功能。没有称为“无”的官方阶段。所以,你不妨把 'foo' 放在那里。 对 Maven 3 中的我来说,这不起作用。<id>…</id>
部分,然后它对我有用。
Maven 3 解决方案并没有真正禁用插件,是吗?根据输出,插件仍在执行。然后它是否尊重跳过配置,以及它选择跳过的方式/内容,似乎取决于各个插件。
mirabilos 的评论是 Maven 3 的正确解决方案,并且可以跨所有插件移植。并非所有插件都有<skip>
参数。【参考方案2】:
查看插件是否有“跳过”配置参数。几乎所有人都这样做。如果是这样,只需将其添加到子声明中:
<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>
【讨论】:
如何命名您正在使用的插件,并运行 help:effective-pom 以查看您是否真的执行正确。 还要注意插件与插件管理。后者覆盖前者。 我正在使用 Cobertura 插件,我不想在子 pom 中运行它。 检查目标在 2.5 中有一个跳过。以前没有。 cobertura 目标没有。 对于那些使用 Tiles Maven 插件 并考虑使用第二个选项(通过 ID 覆盖执行)的人的重要说明:在 tile 内的插件 changes execution IDs 以反映 tile GAV坐标。所以为了覆盖工作<configuration tiles-keep-id="true" />
标签应该添加到执行中以保留指定的执行ID。【参考方案3】:
线程很旧,但也许有人仍然感兴趣。 我发现的最短形式是对 λlex 和 bmargulies 示例的进一步改进。执行标签将如下所示:
<execution>
<id>TheNameOfTheRelevantExecution</id>
<phase/>
</execution>
我要强调的两点:
-
phase 设置为空,看起来比“none”少hacky,但仍然是hack。
id 必须与您要覆盖的执行相同。如果您不指定执行的 id,Maven 会隐式执行(以您不期望的方式)。
发布后发现它已经在***中: In a Maven multi-module project, how can I disable a plugin in one child?
【讨论】:
备案:默认执行 ID 遵循此答案中列出的简单规则:***.com/a/34599117/7641 值得注意的是,这个解决方案实际上 disables(正如 OP 要求的那样)插件(对于给定的执行 ID),而不是依赖于插件特定的“跳过”选项。【参考方案4】:我知道这个帖子真的很旧,但@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>
【讨论】:
以上是关于禁用父 POM 中定义的 Maven 插件的主要内容,如果未能解决你的问题,请参考以下文章
在父 pom 中定义 Maven 插件,但只在子项目中调用插件
使用 Bamboo 构建定义父 POM 的 Subversion/Maven 项目
Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ④ ( 默认生成的 pom 文件 | Maven 中的 pom 配置 | 自定义 pom 文件节点 )