如何用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扩展库来实现遍历文件名列表:
- 引入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>
- 修改下载任务
拆分逗号分隔的文件名列表,循环执行<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
相关产品推荐
相关产品推荐

