代码之家  ›  专栏  ›  技术社区  ›  karoberts

Ant错误无法将旧文件重命名为临时文件

  •  6
  • karoberts  · 技术社区  · 16 年前

    我使用的是AN1.1.0和Java1.60.17,我遇到了一个奇怪的问题。

    在build.xml中,我有一个编译代码的简单任务

    <javac destdir="${dir.build.classes}" debug="on">
        <classpath refid="classpath"/>
        <src path="${dir.src.java}"/>
    </javac>
    

    在“类路径”中是一个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调用之前和之后,我坚持调用Hoel.EXE,并且我可以确认运行Ant的Java进程在JavaC调用期间抓取到Labal.jar的文件句柄,并且它不放弃它。这导致我以后更新jar的尝试失败。

    即使在javac任务完成之后,Ant为什么还要保持类路径中jar的句柄打开?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Mark O'Connor    16 年前

    这是Windows锁定问题。读取文件的任何进程/线程都将阻止在更新现有JAR文件时对其进行重命名,这正是zip任务所做的。

    我猜文件句柄会一直打开,因为您使用的是类路径引用。如果显式地设置javac任务的类路径,文件句柄可能会关闭?

        2
  •  3
  •   karoberts    16 年前

    所以,经过一些试验,我找到了答案。通过添加 fork="true" 对我 javac 任务,文件句柄在任务结束时关闭。这允许我的JAR修改在构建的后期成功。

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

        3
  •  1
  •   Faisal Feroz    16 年前

    对于完全相同的问题有一个bug文件 here .

    他们说这是在Ant 1.8版中修复的

        4
  •  0
  •   user419040    16 年前

    它似乎与类路径配置有关,JAR文件上的第一个操作使它保持打开状态。 我通过从classpath env变量中删除“.”来解决这个问题。

    推荐文章