我正在使用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>
在“类路径”中是一个罐子,称它为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的句柄?
我正在使用ant 1.8.0和Java 1.6.0.17,并且遇到了一个奇怪的问题。在我的build.xml中,我有一个简单的任务,可以编译代码
因此,经过一些实验,我找到了答案。通过将fork="true"
添加到我的javac
任务中,文件句柄在任务结束时关闭。这使我的jar修改可以在以后的构建中成功完成。
这是Windows锁定问题。在更新现有的jar文件时,任何读取该文件的进程/线程都将阻止其重命名,这是zip任务正在执行的操作。
存在与完全相同的问题here的错误。
我尝试过最新版本的ANT(1.10.7)及其对我的工作。
似乎与类路径配置有关,并且对jar文件的第一个操作使它保持打开状态。我已通过删除“”解决了此问题。来自我的classpath env变量。