ошибка муравья Невозможно переименовать старый файл во временный файл

Я использую 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

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

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


person karoberts    schedule 20.02.2010    source источник


Ответы (5)


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

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

person karoberts    schedule 23.02.2010

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

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

person Mark O'Connor    schedule 20.02.2010
comment
Можете ли вы объяснить, что вы подразумеваете под явной установкой пути к классам задачи javac? Это довольно большой набор банок, который используется в нескольких других местах, поэтому их жесткое кодирование на самом деле не вариант, и я не уверен, почему это будет иметь значение. - person karoberts; 20.02.2010

По той же проблеме зарегистрирована ошибка здесь.

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

person Faisal Feroz    schedule 06.11.2010

Я попробовал последнюю версию ANT (1.10.7), и она у меня работает.

Эта проблема была решена в версии 1.9.7.

Что нового в ant

FileUtils.java< /а>

person Sriragavan Natesan    schedule 30.03.2020

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

person user419040    schedule 13.08.2010