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

How to trigger a specific execution of a Maven plugin?

我想弄清楚是否可以在父 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 的模块:

我现在最好的办法是将常见的执行保留在父 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> 部分的用处,因为相同的配置不能只定义一次。我要在我们Portfolio的每个使用logback的模块中定义它,这相当于几十次。

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

您可以在每次执行的配置中添加一个跳过参数,例如:

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

然后你可以在每个模块中选择是否使用或跳过执行,方法是将属性 <copy.logback.skip>设置为truefalse