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

时间:2010-02-20 00:08:33

标签: 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>

在“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>

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

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

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

5 个答案:

答案 0 :(得分:3)

这是一个Windows锁定问题。读取文件的任何进程/线程都会阻止重命名,这是zip任务在更新现有jar文件时所做的事情。

我猜测文件句柄是保持打开的,因为你使用了类路径引用。如果您要显式设置javac任务的类路径,可能会关闭文件句柄?

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

针对完全相同的问题here提交了一个错误。

他们说这是在Ant版本1.8中修复的

答案 3 :(得分:1)

我尝试了最新版本的ANT(1.10.7)及其对我的工作。

此问题已在1.9.7中解决

WHATSNEW in ant

FileUtils.java

答案 4 :(得分:0)

它似乎与类路径配置有关,并且jar文件的第一个操作使它保持打开状态。 我通过删除“。”解决了这个问题。来自我的classpath env变量。