当使用特定配置文件时,禁用Maven插件。

58
我希望找到一种方法,在特定配置文件的情况下禁用插件执行。
这是如果选择了一个配置文件就运行插件的相反情况。
我的使用场景:我的Maven构建有很多插件,但在我的开发机器上运行时,我想跳过其中一些插件。我不想在本地注释掉这些插件,而是想能够只使用“dev”配置文件运行构建。插件将继续在我的持续构建中运行。
有什么想法吗?

3
所有插件都需要一个<skip>元素的功能请求。http://jira.codehaus.org/browse/MNG-3102 - ben75
这将涉及到所有插件都必须支持这些功能。我更多地是考虑 <plugingroup> <run-condition> <notprofile>dev<notprofile> </run-contidion> <plugin..> <plugin..> </plugingroup> 这样的术语。 - jrharshath
你能详细说明一下你想要实现什么吗?是某种打包方式?测试等等?还是其他的?也许你可以提供一些pom文件的摘录? - khmarbaise
2
详细说明:我想设置这样一个环境,当我的Maven构建过程运行时开启了“risky”配置文件时,我希望pmd、checkstyle、findbugs、surefire和failsafe插件不会运行。 - jrharshath
@khmarbaise 我也是一样。我有一个演示配置文件,但单元测试无法在应用程序的演示版本上运行。很少有理由问“为什么”。如果人们开始在这个网站上争吵,他们肯定有理由这样做。 - undefined
3个回答

121

当特定配置文件处于活动状态时,有一种简洁的方法来禁用插件执行。

首先,您需要像这样为插件执行添加标识符:

<build>
    <plugins>
        <!-- (...) -->
        <plugin>
            <groupId>nl.geodienstencentrum.maven</groupId>
            <artifactId>sass-maven-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <id>styles-compilation</id> <!-- plugin execution identifier -->
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>update-stylesheets</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

那么您需要定义一个配置文件,该配置文件将不会执行此插件:

<profiles>
    <profile>
        <id>no-sass</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>nl.geodienstencentrum.maven</groupId>
                    <artifactId>sass-maven-plugin</artifactId>
                    <version>2.1</version>
                    <executions>
                        <execution>
                            <id>styles-compilation</id> <!-- here there must be the same identifier as defined in <build><plugins> section -->
                            <phase>none</phase> <!-- this disables plugin -->
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

现在,如果您运行标准的Maven构建:

mvn clean package

在运行时,sass-maven-plugin将会被执行:

mvn clean package -P no-sass

sass-maven-plugin不会被执行。


非常好的答案。这甚至允许从生命周期中删除标准插件,例如maven-compiler-plugin - Michael Piefel
3
我想扩展这个答案。值得一提的是:1)使用<phase>none</phase>可以禁用特定的<execution>,而不是整个插件;2)可以使用类似于<phase>${enablePhase}</phase>的变量,并在不同的配置文件中设置或未设置该变量。这样就可以有条件地运行某个execution。 - Alexander Samoylov

24
  • 定义您的POM,以便它仅在开发模式下具有所需的插件
  • 定义开发配置文件
  • 定义包含您想要/需要的所有插件的生产配置文件
  • 将生产配置文件定义为默认配置文件

示例POM:

<profiles>
  <profile>
    <id>production</id>

    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>

    <build>
      <plugins>
        <!-- 
        <plugin>
          ...
        </plugin>
        -->
      </plugins>
    </build>
    </profile>

    <profile>
      <id>dev</id>
      <!-- Some other logic here, if necessary.
           Otherwise, there's no need for another profile. -->
    </profile>
</profiles>

要以开发模式运行,您可以调用以下命令:

mvn -Pdev compile

要在生产模式下运行,只需使用正常步骤:

mvn compile

如果您不想/不需要在您的开发配置文件中定义任何特殊内容,您可以省略它的声明并像这样调用您的开发模式!会禁用配置文件):

如果您不想/不需要在您的开发配置文件中定义任何特殊内容,您可以省略它的声明并像这样调用您的开发模式!会禁用配置文件):

mvn -P!production compile

注意:由于感叹号在bash中是特殊字符,因此您可能需要对其进行转义:

mvn -P\!production compile

请添加以下步骤:1)要使用插件运行项目,只需像往常一样构建即可;2)要在没有插件的情况下运行项目,请执行“mvn clean package ... -P !production”。注意:如果dev配置文件中不包含任何特定内容,则不需要使用它。-P!profileName应足以排除该配置文件。 - carlspring
1
@carlspring,你能帮我解决一下为什么会出现这个错误吗?$ mvn -P !production clean -bash: !production: 事件未找到 - Absurd-Mind
你说得对,是我的错!我几乎可以发誓以前我就是这样做的。 :) - carlspring
您可以使用以下命令禁用历史替换:set +H - Absurd-Mind
是否可以创建插件定义并从配置文件中“调用”它,以便我们可以重用一些XML定义? - Kalpesh Soni

11
建立在Krzysiek的回答之上,您不需要定义显式执行,只需查看maven给出的输出并禁用默认执行即可。
例如,假设从maven得到以下输出:
[INFO] --- maven-resources-plugin:2.7:copy-resources (prepare-dockerfile) @ tilbud ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
...
[INFO]
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ tilbud ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
....
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ tilbud ---
...
[INFO]
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ tilbud ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
...
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:testCompile (default-testCompile) @ tilbud ---
....

在插件和目标后面括号中列出了默认生成的执行名称。以下配置文件禁用了上述插件:

<profiles>
    <profile>
        <id>packageOnly</id>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>default-compile</id>
                                <phase>none</phase>
                            </execution>
                            <execution>
                                <id>default-testCompile</id>
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>default-test</id>
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>default-resources</id>
                                <phase>none</phase>
                            </execution>
                            <execution>
                                <id>default-testResources</id>
                                <phase>none</phase>
                            </execution>
                            <execution>
                                <id>prepare-dockerfile</id>
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
</profiles>

1
值得一提的是,他仅使用生命周期默认插件进行工作,因为它们的绑定在default-bindings.xml中声明,并且它们的default-... ID由Maven动态创建。POM中声明的<build>/<plugins>/<plugin>无法被<profile>/<build>/<pluginManagement>/<plugins>/<plugin>覆盖,因为它们的工作方式相反:(专业化)<plugin>覆盖(通用)<pluginManagement> - Gerold Broser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接