2010-02-20 2 views
6

Я использую ant 1.8.0 и java 1.6.0.17, и у меня возникает странная проблема.ant error Невозможно переименовать старый файл во временный файл

В моем 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

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

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

ответ

3

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

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

3

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

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

+0

Можете ли вы объяснить, что вы имеете в виду под «явно установить путь к классам JAVAC задачи по»? Это довольно большой набор фляг, который используется в нескольких других местах, поэтому жесткое их кодирование на самом деле не вариант, и я не уверен, почему это изменило бы ситуацию. – karoberts

0

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

1

Существует ошибка, зарегистрированная по тому же вопросу here.

Они говорят, что это фиксируется в Ant версии 1.8