我正在编写一个大型 Ant 脚本(> 1000 行),该脚本是我从其他人那里继承的(不再可用)。 我遇到 Ant 不删除目录的问题。在脚本中的某一时刻它起作用,而在另一时刻却不起作用:Ant 不会给出错误消息,但它也会将目录保留在原来的位置。
我在它周围放置了一些常规,以检查目录是否存在:
<groovy>
println("Directories in @{outFolder} are:")
new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
</groovy>
<delete verbose="true" includeEmptyDirs="true" >
<dirset dir="@{outFolder}" includes="**/*" />
</delete>
<echo>End of delete</echo>
<groovy>
println("Directories in @{outFolder} are:")
new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
</groovy>
因此,这些行被调用并且起作用。接下来,调用其他一些应用程序来创建新目录。 再次调用完全相同的行(复制和粘贴,是的,它们是相等的),但现在目录没有被删除。另外:没有错误,Ant 继续运行。 我在 Windows Server 2008 R2 上使用 Ant 1.8.1。我尝试添加 sleep ,以防止锁定问题。创建目录的应用程序是 Java 应用程序 (Tibco appManage)。这些目录包含 XML 文件,没有 jar 文件。我检查了 ANT_HOME 和 CLASSPATH:没有问题。 我错过了什么?
对于聪明的人来说:当然,第二次删除不应删除应用程序创建的所有内容,但为了解决问题,我使脚本行尽可能简单。
一些更多信息:由于我无法进行删除,我尝试使用 Ant move 作为解决方法。这就是我所看到的:移动在目的地创建空目录,不会从源中删除任何文件或目录,并且不会报告错误。 这些源目录/文件(我之前尝试删除)似乎有问题。
另一次尝试:下载最新版本的 Ant 和 Groovy。结果相同。
最佳答案
您正在使用dirset。使用文件集。
说明: 一个dirset不是你想的那样。您几乎总是想使用文件集。
第一次,它可以工作,因为目录是空的。第二次,他们就不是了。我可以这么说,因为 <dirset>
包括目录对象本身,但不包括其中的任何文件,并且您在删除任务中使用“includeEmptyDirs”,这对于 dirset 没有意义。
在这样的假设树中:
top/
sub1/
file.txt
sub2/ (empty)
...dirset 集合将选择 top/、top/sub1/和 top/sub2/,但不会 top/sub1/file.txt。 <delete>
作用于集合,并且不会删除非空目录。因此,在上述情况下,它将删除 top/sub2 (为空),但不会删除 top/sub1 或 top/。这也应该为您解释 <move>
的结果尝试,它让您了解 dirset 实际上有用的情况。
一个fileset包括文件和目录。
关于Ant删除首先起作用,然后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090380/