ANT Delete任务在排除项无匹配文件时执行失败的解决方法咨询
解决ANT Delete任务在排除文件不存在时失败的问题
这个问题的核心是你写的排除模式语法有误,再结合ANT默认的错误处理逻辑导致了失败。下面是具体的修复方案和解释:
1. 修正排除模式的写法
ANT的<fileset>中,<exclude>/<include>的name属性如果要指定多个匹配模式,需要用逗号(,)或分号(;)分隔,而不是空格。你当前的写法:
<exclude name="**/FOO.xml **/BAR.xml"/>
会被ANT解析成一个单一的模式——寻找文件名包含空格、同时匹配**/FOO.xml **/BAR.xml的文件,这完全达不到你排除两个文件的目的。
正确的写法有两种:
方式一:拆分多个<exclude>标签
<delete includeemptydirs="true" followsymlinks="false"> <fileset dir="${apache.base}" erroronmissingdir="false"> <include name="**/*"/> <exclude name="**/FOO.xml"/> <exclude name="**/BAR.xml"/> </fileset> </delete>
方式二:用逗号分隔多个模式
<delete includeemptydirs="true" followsymlinks="false"> <fileset dir="${apache.base}" erroronmissingdir="false"> <include name="**/*"/> <exclude name="**/FOO.xml,**/BAR.xml"/> </fileset> </delete>
2. 确保任务始终正常返回
如果想要彻底避免因“没有匹配到可删除文件”或“个别文件删除失败”导致任务报错,可以给<delete>标签加上failonerror="false"属性。这个属性会让ANT忽略删除过程中的错误,无论结果如何都返回成功:
<delete includeemptydirs="true" followsymlinks="false" failonerror="false"> <fileset dir="${apache.base}" erroronmissingdir="false"> <include name="**/*"/> <exclude name="**/FOO.xml,**/BAR.xml"/> </fileset> </delete>
为什么之前的代码会出现异常?
当FOO.xml或BAR.xml存在时,虽然你的排除模式写错了,但任务可能因为这些文件存在,删除其他文件时没有遇到权限或锁定问题,所以能正常完成;而当这两个文件都不存在时,错误的排除模式等于没有排除任何文件,任务会尝试删除${apache.base}下的所有内容,此时很可能遇到无法删除的文件(比如正在被占用的文件),导致任务失败。
内容的提问来源于stack exchange,提问作者Mr S
相关产品推荐
相关产品推荐

