无法使用 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...
您为什么不尝试删除顺序任务,看看是否可以解决问题。
自从我将 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...
您为什么不尝试删除顺序任务,看看是否可以解决问题。