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的句柄?
经过一些实验,我找到了答案。通过添加fork="true"到我的javac任务,文件句柄在任务结束时关闭。这使我的jar修改可以在以后的构建中成功完成。
不过,这很不幸,因为我必须记住将其添加到每个上游javac任务中。