ant error Невозможно переименовать старый файл во временный файл - PullRequest
7 голосов
/ 20 февраля 2010

Я использую 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" есть банка, назовите ее 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

Я застрял в вызове handle.exe до и после вызова javac, и я могу подтвердить, что процесс java, выполняющийся ant, захватывает дескриптор файла в library.jar во время вызова javac, и он не прекращает его , Это приводит к тому, что моя более поздняя попытка обновить банку не удалась.

Зачем муравью держать указатель на банку в открытом пути к классу даже после завершения задачи javac?

Ответы [ 4 ]

4 голосов
/ 23 февраля 2010

Итак, я нашел ответ после некоторых экспериментов. При добавлении fork="true" в мою задачу javac дескриптор файла закрывается в конце задачи. Это позволяет моей модификации jar завершиться позже в сборке.

Это прискорбно, потому что я должен помнить, чтобы добавлять это к каждой восходящей задаче javac.

3 голосов
/ 20 февраля 2010

Это проблема блокировки окон. Любой процесс / поток, читающий файл, будет препятствовать его переименованию, как это делает задача zip, при обновлении существующего файла JAR.

Я предполагаю, что дескриптор файла остается открытым, потому что вы используете ссылку на classpath. Может быть, дескрипторы файлов могут быть закрыты, если вы явно зададите путь к классу задачи javac?

1 голос
/ 06 ноября 2010

Существует ошибка, поданная по той же проблеме здесь

Говорят, что это исправлено в Ant версии 1.8

0 голосов
/ 13 августа 2010

Похоже, это связано с настройкой пути к классам. Первая операция над файлом jar сохраняет его открытым. Я решил эту проблему, удалив "." из моей переменной enp пути к классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...