无法使用 Ant 执行 <sequential> 任务

Cannot execute <sequential> task with Ant

自从我将 Java 从 JDK7u55 更新到 JDK7u60 后,我在运行构建时遇到了问题。我在 Windows Server 2003 标准版上使用 Ant 1.6.5。以下是导致问题的 Ant 任务。

<!-- RUN JUNIT TASK -->
<target name="run_junit" description="Runs all JUnit tests in another JVM">
    <sequential>
            <move file="${MyProject}\bin\myApp.jar" tofile="${MyProject}\bin\myApp_original.jar"/>
            <move file="${MyProject}\bin\myApp_test.jar" tofile="${MyProject}\bin\myApp.jar"/>

            <exec executable="WinTail" spawn="true">
                <arg value="${MyProject}\junit.log"/>
            </exec>

            <java classname="myProject.test.AllTests"
                maxmemory="256m"
                fork="true"
                output="${MyProject}\junit.log"
                dir="${MyProject}\bin"
                append="true">
            <jvmarg value="-Djdk.lang.Process.allowAmbigousCommands=true"/>
            <arg value="${MyProject}\bin"/>
            <classpath>
                <fileset dir="${MyProject}\bin">
                    <include name="myApp.jar"/>
                </fileset>
                <pathelement path="${MyProject}\bin"/>
            </classpath>
            </java>

            <move file="${MyProject}\bin\myApp.jar" tofile="${MyProject}\bin\myApp_test.jar"/>
            <move file="${MyProject}\bin\myApp_original.jar" tofile="${MyProject}\bin\myApp.jar"/>
    </sequential>
</target>

重命名两个 JAR 后,我开始使用 <java> 任务运行所有测试。 AllTests.java 使用单独的线程来运行每个测试。有些测试需要更长的时间才能完成,而有些测试实际上没有响应。我曾经使用 ProcessExplorer 手动杀死它们。完成后,它用于执行下一个命令,将 JAR 重命名为它们的原始名称。我用JDK7u55的时候用过。

现在,自从我将 Java 升级到 JDK7u60 后,不再等待所有测试完成,而是尝试最后两个 <move> 命令。这会导致构建失败,因为 <move> 无法继续,因为测试类正在使用底层 JAR 文件。我得到以下错误:

BUILD FAILED

C:\MyProject\build.xml:579: Unable to delete file C:\MyProject\bin\myApp.jar

我想知道 JDK7u60 中发生了什么变化导致了这种行为。我检查了 JDK7u60 的发行说明但没有得到任何东西。有人可以解释一下吗?

首先 windows 属于另一个进程或线程的文件阻止文件被删除的情况并不少见。

其次,您的 ANT 目标中的顺序任务的目的到底是什么? documentation描述任务如下:

Sequential is a container task - it can contain other Apache Ant tasks. The nested tasks are simply executed in sequence. Sequential's primary use is to support the sequential execution of a subset of tasks within the parallel task

在你的情况下没有用 parallel...

您为什么不尝试删除顺序任务,看看是否可以解决问题。