You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ant脚本从XML提取文件名并批量下载对应文件?

解决Ant脚本批量下载Jenkins构建产物的问题

问题分析

你的脚本中,xmlproperty将XML里的多个fileName节点值合并成了一个逗号分隔的字符串(比如project_a-internet.zip,project_a-libs-forbidden.zip,project_a-libs-lgpl.zip)。直接把这个字符串拼接到URL后传给<get>任务,Ant会将整个字符串当作单个URL处理,而不是多个独立的下载链接,因此无法实现批量下载。

可行解决方案

方案1:使用Ant-Contrib的<for>循环(需额外依赖)

Ant默认没有循环任务,需要借助Ant-Contrib扩展库来实现遍历文件名列表:

  1. 引入Ant-Contrib任务
    先下载Ant-Contrib的jar包,将其放入Ant的lib目录,或者在脚本中通过taskdef声明:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="path/to/ant-contrib-1.0b3.jar"/>
    </classpath>
</taskdef>
  1. 修改下载任务
    拆分逗号分隔的文件名列表,循环执行<get>任务:
<project name="Project ABC" default="download">
    <property name="workspace" value="ant-workspace"/>
    <property name="jenkinsBaseUrl" value="http://jenkins/project_abc"/>
    <property name="jenkinsXmlApi" value="${jenkinsBaseUrl}/api/xml"/>

    <!-- 引入Ant-Contrib任务 -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="ant-contrib-1.0b3.jar"/> <!-- 替换为你的jar路径 -->
        </classpath>
    </taskdef>

    <target name="prepare-download">
        <mkdir dir="${workspace}"/>
        <get src="${jenkinsXmlApi}" dest="${workspace}/jenkins.xml"/>
        <xmlproperty file="${workspace}/jenkins.xml"/>
    </target>

    <target name="download" depends="prepare-download">
        <!-- 遍历逗号分隔的文件名列表 -->
        <for list="${mavenBuild.artifact.fileName}" delimiter="," param="fileName">
            <sequential>
                <get 
                    src="${jenkinsBaseUrl}/@{fileName}" 
                    dest="${workspace}/@{fileName}"
                    verbose="true"
                />
            </sequential>
        </for>
    </target>
</project>

方案2:使用Groovy脚本(无需额外依赖,需Ant支持Groovy)

如果你的环境中已经配置了Groovy,可以用<script>任务直接处理字符串拆分和循环:

<project name="Project ABC" default="download">
    <property name="workspace" value="ant-workspace"/>
    <property name="jenkinsBaseUrl" value="http://jenkins/project_abc"/>
    <property name="jenkinsXmlApi" value="${jenkinsBaseUrl}/api/xml"/>

    <target name="prepare-download">
        <mkdir dir="${workspace}"/>
        <get src="${jenkinsXmlApi}" dest="${workspace}/jenkins.xml"/>
        <xmlproperty file="${workspace}/jenkins.xml"/>
    </target>

    <target name="download" depends="prepare-download">
        <script language="groovy">
            def fileNames = properties['mavenBuild.artifact.fileName'].split(',')
            def baseUrl = properties['jenkinsBaseUrl']
            def workspace = properties['workspace']

            fileNames.each { fileName ->
                def srcUrl = "${baseUrl}/${fileName.trim()}"
                def destFile = new File(workspace, fileName.trim())
                println "Downloading ${srcUrl} to ${destFile.path}"
                
                // 调用Ant的get任务
                ant.get(src: srcUrl, dest: destFile.path)
            }
        </script>
    </target>
</project>

关键说明

  • 两种方案都先拆分了逗号分隔的文件名列表,确保每个文件名对应独立的下载请求;
  • 方案1需要额外引入Ant-Contrib库,适合无法使用Groovy的环境;
  • 方案2借助Groovy的灵活性,代码更简洁,无需额外依赖(前提是Ant已集成Groovy)。

内容的提问来源于stack exchange,提问作者Falco Preiseni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:58:12