2010-02-20 22 views
6

Sto usando form 1.8.0 e java 1.6.0.17 e sto correndo in uno strano problema.errore form Impossibile rinominare il vecchio file nel file temporaneo

Nel mio build.xml, ho un compito semplice che compila il codice

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

Nel "percorso di classe" è un vaso, lo chiamano library.jar

in un'attività successiva, ho bisogno di aggiungere un paio di classi per library.jar, che mi piace questo

<jar destfile="library.jar" update="true" duplicate="fail"> 
    <fileset dir="${dir.build.classes}"> 
     <include name="some/class/files"/> 
    </fileset> 
</jar> 

Ciò con l'errore Unable to rename old file (library.jar) to temporary file

Mi sono bloccato in una chiamata a handle.exe prima e dopo la chiamata javac e posso confermare che il processo java che esegue formica un handle di file su library.jar durante la chiamata javac e non lo dà su. Ciò causa il mio tentativo successivo di aggiornare il vaso per fallire.

Perché dovrebbe mantenere un handle per il jar in un classpath aperto anche dopo il completamento dell'attività javac?

risposta

3

Quindi ho trovato la risposta, dopo alcuni esperimenti. Aggiungendo fork="true" alla mia attività javac, l'handle di file viene chiuso alla fine dell'attività. Ciò consente alla mia modifica jar di avere successo in seguito nella build.

È sfortunato, però, perché devo ricordarmi di aggiungerlo a ogni operazione javac upstream.

3

Questo è un problema di blocco di Windows. Qualsiasi processo/thread che legge il file impedirà che venga rinominato, che è ciò che sta facendo l'attività di zip, quando aggiorna un file jar esistente.

Suppongo che l'handle di file venga tenuto aperto perché si utilizza un riferimento al percorso di classe. Forse gli handle di file potrebbero essere chiusi se si fosse impostato in modo esplicito il percorso di classe dell'attività javac?

+0

Puoi spiegare cosa si intende per "impostare in modo esplicito classpath del compito javac"? È un set di vasi piuttosto grande che viene usato in molti altri posti, quindi non è davvero un'opzione difficile da codificare, e non sono sicuro del perché farebbe la differenza. – karoberts

0

Sembra correlato alla configurazione del classpath e La prima operazione sul file jar lo mantiene aperto. Ho risolto questo problema rimuovendo "." dalla mia variabile env classpath.

1

C'è un bug archiviato per lo stesso identico numero here.

Stanno dicendo che questo è stato risolto in versione 1.8 Ant

Problemi correlati