2010-02-20 10 views
6

Ich benutze Ameise 1.8.0 und Java 1.6.0.17 und ich bin in einem seltsamen Problem läuft.ant Fehler Kann alte Datei nicht in temporäre Datei umbenennen

In meinem build.xml, ich habe eine einfache Aufgabe, die den Code

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

Im "Classpath" ist ein Glas, nennen es library.jar

In einer späteren Aufgabe stellt, muss ich fügen Sie ein paar Klassen zu library.jar, die ich tun, wie diese

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

Dies mit dem Fehler fehl Unable to rename old file (library.jar) to temporary file

Ich steckte in einem Aufruf von handle.exe vor und nach dem javac-Aufruf, und ich kann bestätigen, dass der Java-Prozess, der ant läuft, ein Dateihandle zu library.jar während des javac-Aufrufs ergreift, und es gibt es nicht oben. Dies führt dazu, dass mein späterer Versuch, das jar zu aktualisieren, fehlschlägt.

Warum sollte ant ein Handle für das jar in einem Klassenpfad behalten, der geöffnet ist, selbst nachdem die javac-Task abgeschlossen ist?

Antwort

3

So fand ich die Antwort nach einigen Experimenten. Durch Hinzufügen von fork="true" zu meiner javac Aufgabe wird das Dateihandle am Ende der Aufgabe geschlossen. Dadurch kann meine JAR-Modifikation später im Build erfolgreich ausgeführt werden.

Es ist bedauerlich, denn ich muss daran denken, dies zu jedem Upstream-Java-Task hinzuzufügen.

3

Dies ist ein Problem mit der Windows-Sperrung. Jeder Prozess/Thread, der die Datei liest, verhindert, dass sie umbenannt wird, was die Aufgabe zip tut, wenn eine vorhandene jar-Datei aktualisiert wird.

Ich vermute, dass das Dateihandle geöffnet bleibt, weil Sie einen Klassenpfad verwenden. Vielleicht sind die Datei-Handles geschlossen, wenn Sie explizit den Klassenpfad der Java-Task festlegen?

+0

in Ant Version behoben ist, können Sie erklären, was Sie meinen „die javac Aufgabe des Classpath explizit gesetzt“? Es ist eine ziemlich große Reihe von Gläsern, die an verschiedenen anderen Orten verwendet wird, also ist es nicht wirklich eine Option, sie hart zu codieren, und ich bin mir nicht sicher, warum es einen Unterschied machen würde. – karoberts

0

Es scheint im Zusammenhang mit Klassenpfadkonfiguration und der erste Vorgang für die JAR-Datei bleibt geöffnet. Ich habe dieses Problem gelöst, indem ich "." von meiner Classpath-env-Variable.

1

Es gibt einen Fehler für genau das gleiche Problem here.

Sie sagen, dass diese 1,8