7

我正在使用 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 的句柄?

4

5 回答 5

5

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

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

于 2010-02-23T15:17:19.263 回答
3

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

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

于 2010-02-20T02:39:24.890 回答
1

这里有一个针对完全相同问题的错误。

他们说这在 Ant 1.8 版中已修复

于 2010-11-06T11:39:11.753 回答
1

我尝试了 ANT(1.10.7) 的最新版本,它对我有用。

此问题已在 1.9.7 中解决

蚂蚁的新功能

FileUtils.java

于 2020-03-30T08:30:06.953 回答
-1

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

于 2010-08-13T00:02:58.287 回答