2010-02-20 22 views
6

Estoy usando hormiga 1.8.0 y Java 1.6.0.17 y me encuentro con un problema extraño.error de hormiga No se puede cambiar el nombre del archivo anterior al archivo temporal

En mi build.xml, tengo una tarea sencilla que compila el código

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

En la "ruta de clases" es un frasco, lo llaman library.jar

En una tarea posterior, necesito añadir unas pocas clases de library.jar, lo que me gusta este

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

este fallará con el error Unable to rename old file (library.jar) to temporary file

Puse en una llamada a handle.exe antes y después de la llamada javac, y puedo confirmar que el proceso java que ejecuta ant agarra un identificador de archivo a library.jar durante la llamada javac, y no le da arriba. Esto hace que mi intento posterior de actualizar el jar falla.

¿Por qué mantener un asa en el jar en un classpath abierto incluso después de que se complete la tarea javac?

Respuesta

3

Así que encontré la respuesta, después de algunos experimentos. Al agregar fork="true" a mi tarea javac, el identificador del archivo se cierra al final de la tarea. Esto permite que mi modificación jar tenga éxito más adelante en la compilación.

Sin embargo, es una pena porque tengo que acordarme de agregar esto a cada tarea javac en sentido ascendente.

3

Este es un problema de bloqueo de Windows. Cualquier proceso/subproceso que lea el archivo evitará que se renombre, que es lo que está haciendo la tarea zip al actualizar un archivo jar existente.

Supongo que el identificador del archivo se mantiene abierto porque usa una referencia de ruta de clase. ¿Tal vez los manejadores de archivo podrían cerrarse si establecieras explícitamente el classpath de la tarea javac?

+0

Puede explicar qué quiere decir con "establecer explícitamente ruta de clase de la tarea javac"? Es un conjunto bastante grande de frascos que se usa en muchos otros lugares, por lo que codificarlos con dureza no es realmente una opción, y no estoy seguro de por qué marcaría la diferencia. – karoberts

0

Parece estar relacionado con la configuración de classpath y la primera operación en el archivo jar lo mantiene abierto. He resuelto este problema eliminando "." desde mi variable de entorno classpath.

1

Se ha producido un error para exactamente el mismo problema here.

Están diciendo que este se fija en la versión 1.8 Ant

Cuestiones relacionadas