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

Maven antrun plugin missing target task after combining from multiple profiles

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

<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. 对你的每个执行使用一个<id>:没有它,你会得到默认值,这就是maven在合并它们时用来确定重复配置项的方法。
  2. 使用combine.children等。我建议你不要那样做,但你可以在 blog.sonatype.com or at maven.apache.org.
  3. 上阅读更多内容

您也可以直接使用 ant 的强大功能,创建目标并使用 condition.

有条件地调用它