从多个配置文件组合后,Maven antrun 插件缺少目标任务

Posted

技术标签:

【中文标题】从多个配置文件组合后,Maven antrun 插件缺少目标任务【英文标题】:Maven antrun plugin missing target task after combining from multiple profiles 【发布时间】:2021-03-25 01:23:00 【问题描述】:

这是一个非常有趣的问题,我有 2 个配置文件,定义如下。我正在使用带有最新 Java 11 的 Maven 3.6.3。

<profiles>
  <profile>
    <id>assembly-unzip</id>
    <build>
      <plugins>          
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
            <execution>
              <phase>validate</phase>
              <goals>
                <goal>run</goal>
              </goals>
              <configuration>
                <target>
                  <unzip src="src1.zip" dest="dest10" />
                  <copy  file="copy1.txt" todir="dest11"/>
                </target>
              </configuration>              
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>   
  <profile>
    <id>assembly-get</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
            <execution>
              <phase>validate</phase>
              <goals>
                <goal>run</goal>
              </goals>
              <configuration>
                <target>
                  <mkdir dir="download" />
                  <get src="src20" dest="dest"/>
                  <unzip src="dest/src20" dest="dest"/>
                  <get src="src21" dest="dest"/>
                  <unzip src="dest/src21" dest="dest"/>                  
                </target>
              </configuration>
            </execution>
          </executions>
        </plugin>        
      </plugins>
    </build>
  </profile>     
</profiles>

当我激活两个配置文件时,我从 (-X) 中得知 Maven 将 2 个 antrun 插件配置组合成一个配置,如下所示:

<configuration>
  <exportAntProperties default-value="false"/>
  <failOnError default-value="true"/>
  <localRepository>$localRepository</localRepository>
  <mavenProject default-value="$project"/>
  <pluginArtifacts>$plugin.artifacts</pluginArtifacts>
  <session default-value="$session"/>
  <skip default-value="false">$maven.antrun.skip</skip>
  <sourceRoot>$sourceRoot</sourceRoot>
  <target>
    <mkdir dir="download"/>
    <get src="src20" dest="dest"/>
    <unzip src="dest/src20" dest="dest"/>
    <get src="src21" dest="dest"/>
    <unzip src="dest/src21" dest="dest"/>
    <copy  file="copy1.txt" todir="dest11"/>
  </target>
  <testSourceRoot>$testSourceRoot</testSourceRoot>
  <versionsPropertyName default-value="maven.project.dependencies.versions"/>
</configuration>

组合配置中缺少的是:

<unzip src="src1.zip" dest="dest10" />

我已经以不同的方式多次尝试过,总而言之,如果 Maven 处理的第一个配置文件中有一个任务(例如),那么第二个配置文件中的任何任务似乎将被忽略并且不是组合配置的一部分。请注意,我只是用作示例。我已经尝试过其他任务并看到相同的行为。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以做两件事:

    在每次执行时使用&lt;id&gt;:没有它,您将获得默认值,这就是 maven 在合并它们时用来确定重复配置项的方法。 使用 combine.children 等。我建议您不要这样做,但您可以在 blog.sonatype.com 或 maven.apache.org 上阅读更多信息。

您也可以直接使用ant 的强大功能,创建目标并使用condition 有条件地调用它。

【讨论】:

非常感谢。那成功了。然后要记住的另一个想法是它们在 POM 中出现的顺序是它们被评估的顺序。所以这回答了我的问题。再次感谢。 在不同的配置文件中订购多个插件都附加到相同的生命周期阶段还有一个额外的问题。显然这是一个旧错误,似乎没有得到充分解决。所以我必须将插件附加到不同的生命周期阶段才能正确有序地运行。 我没有看到问题。对我来说,Maven 按声明顺序排序。 "Maven order thing by order of declaration" 不幸的是,事实并非如此。

以上是关于从多个配置文件组合后,Maven antrun 插件缺少目标任务的主要内容,如果未能解决你的问题,请参考以下文章

如何从maven-antrun-plugin执行ant jar

Maven插件maven-antrun-plugin的使用

使用 Maven 填充数据库

用AntRun插件测试Maven的生命周期

未能执行目标 maven-antrun-plugin - GitHub 操作上的连接超时

Maven实战之antrun插件