我正在使用 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>
在“类路径”中有一个 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 的句柄?
最佳答案
所以我找到了答案,经过一些实验。通过添加 fork="true"
到我的 javac
任务,文件句柄在任务结束时关闭。这允许我的 jar 修改在构建的后期成功。
不过很不幸,因为我必须记住将其添加到每个上游 javac 任务中。
关于ant错误无法将旧文件重命名为临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300473/