【问题标题】:How to trigger a specific execution of a Maven plugin?如何触发 Maven 插件的特定执行?
【发布时间】:2020-12-27 13:39:19
【问题描述】:

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

更具体地说,我有几个从我们公司范围的父 pom.xml 继承的多模块项目。在父 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 中 &lt;pluginManagement&gt; 部分的有用性,因为不能只定义一次相同的配置。我必须在我们使用 logback 的 Portfolio 的每个模块中定义它,这相当于数十次。

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

【问题讨论】:

    标签: maven maven-resources-plugin


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个解决方案是最好的:简单。我想知道为什么整个大脑都在哪里,而我却没有找到解决方案。有这个社区存在,有像你这样的贡献者存在,真是一件幸事。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2014-03-29
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多