ant error无法将旧文件重命名为临时文件

kar*_*rts 7 ant jar javac filehandle

我正在使用ant 1.8.0和java 1.6.0.17而且我遇到了一个奇怪的问题.

在我的build.xml中,我有一个编译代码的简单任务

<javac destdir="${dir.build.classes}" debug="on">
    <classpath refid="classpath"/>
    <src path="${dir.src.java}"/>
</javac>
Run Code Online (Sandbox Code Playgroud)

在"classpath"中是一个jar,称之为 library.jar

在以后的任务中,我需要添加一些类library.jar,我喜欢这样

<jar destfile="library.jar" update="true" duplicate="fail">
    <fileset dir="${dir.build.classes}">
        <include name="some/class/files"/>
    </fileset>
</jar>
Run Code Online (Sandbox Code Playgroud)

这将失败并显示错误 Unable to rename old file (library.jar) to temporary file

我在javac调用之前和之后调用了handle.exe,我可以确认运行ant的java进程在javac调用期间抓取了一个文件句柄到library.jar,并且它没有放弃它.这导致我后来尝试更新jar失败.

为什么即使在javac任务完成后,ant也会在类路径中保持jar的句柄?

kar*_*rts 5

经过一些实验,我找到了答案。通过添加fork="true"到我的javac任务,文件句柄在任务结束时关闭。这使我的jar修改可以在以后的构建中成功完成。

不过,这很不幸,因为我必须记住将其添加到每个上游javac任务中。