如何触发Maven插件的特定执行?

问题描述

我试图弄清楚是否有可能在父pom的<pluginManagement>部分中定义Maven插件的执行,并在子项目中选择一个特定的执行,并且仅选择一个执行。

>

更具体地说,我有几个多模块项目是从我们公司范围的父pom继承的。在父pom的<pluginManagement>部分中,我使用 copy-resources 目标执行了数次maven-resources-plugin,它们均绑定到阶段 validate ,但是使用不同的配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <inherited>true</inherited>
    <executions>
        <execution>
            <id>copy-codedeploy</id>
            <phase>validate</phase>
            ...
        </execution>
        <execution>
            <id>copy-settings</id>
            <phase>validate</phase>
            ...
        </execution>

        <execution>
            <id>copy-logback</id>
            <phase>validate</phase>
            ...
        </execution>
    </executions>
<plugin>

在对子项目进行了数小时的尝试之后,我想:

  1. 避免在所有模块中不必要地执行 copy-logback ,这在我在父POM中定义执行 copy-logback 时会发生,并且存在创建目标的缺点所有模块中的文件夹层次结构。
  2. 如果在父POM中未定义执行,请避免在所有需要的模块中的多个克隆副本中定义执行。

一个子项目示例包含以下模块,其中第一个模块是唯一真正需要 copy-logback 的模块:

  • webapp
  • 休息
  • 服务
  • 持久性

我现在到达的最好的方法是将常见执行保留在父POM中,这使我在上面的第一个列表中获得了项目#1,但仍然让我在多个模块中克隆了完全相同的插件配置。我要克隆的配置是这样的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
        <!-- copy logback.xml from the parent to the main resources folder,filtering the application name used in log file names. -->
        <execution>
            <id>copy-logback-file</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
                <resources>
                    <resource>
                        <directory>${project.basedir}/../logback-templates</directory>
                        <filtering>true</filtering>
                        <includes>
                            <include>logback.xml</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

不幸的是,这将减少父POM中<pluginManagement>节的用处,因为同一配置不能只定义一次。我必须在使用logback的投资组合的每个模块中定义它,这需要数十次。

解决我的重复问题,我认为也许可以定义一个插件的执行,该插件的执行可以在需要的地方选择性地触发。有可能吗?

解决方法

您可以为每个执行的配置添加一个skip参数,例如:

<skip>${copy.logback.skip}</skip>

然后,您可以通过将属性<copy.logback.skip>设置为truefalse,在每个模块中选择使用还是跳过执行。