我正在使用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的句柄?
答案 0 :(得分:3)
这是一个Windows锁定问题。读取文件的任何进程/线程都会阻止重命名,这是zip任务在更新现有jar文件时所做的事情。
我猜测文件句柄是保持打开的,因为你使用了类路径引用。如果您要显式设置javac任务的类路径,可能会关闭文件句柄?
答案 1 :(得分:3)
经过一些实验,我找到了答案。通过向fork="true"
任务添加javac
,文件句柄将在任务结束时关闭。这允许我的jar修改在构建的后期成功。
但不幸的是,因为我必须记住将其添加到每个上游javac任务中。
答案 2 :(得分:1)
针对完全相同的问题here提交了一个错误。
他们说这是在Ant版本1.8中修复的
答案 3 :(得分:1)
答案 4 :(得分:0)
它似乎与类路径配置有关,并且jar文件的第一个操作使它保持打开状态。 我通过删除“。”解决了这个问题。来自我的classpath env变量。