2009-04-26 3 views
6

Estoy intentando actualizar un archivo en un frasco existente (en este ejemplo antlr) usando el comando:archivo de actualización en un frasco lanza ZipException

jar -uf antlrworks-1.2.3.jar org/antlr/codegen/templates/Java/Java.stg 

pero me sale el siguiente mensaje

java.util.zip.ZipException: entrada duplicada: antlr/ANTLRError.class en java.util.zip.ZipOutputStream.putNextEntry (ZipOutputStream.java:175) en java.util.jar.JarOutputStream.putNextEntry (JarOutputStream.java : 92) at sun.tools.jar.Main.update (Main.java:508) en sun.tools.jar.Main.run (Main.java:185) en sun.tools.jar.Main.main (Main.java:1044)

¿Alguna idea?

Respuesta

8

Está intentando hacer lo correcto, pero el archivo jar es problemático; tiene la misma entrada dos veces :((Esto es legal para un archivo zip, pero no es realmente útil, y como puede ver, hace jar se quejan.)

Si ejecuta

jar tvf antlrworks-1.2.3.jar > contents 

y luego examina el archivo generado contents verá que hay varios archivos duplicados. probablemente debería informar de ello al proyecto antlr (después de comprobar ellos no saben ya).

Como solución temporal, puede extraer el contenido del archivo jar, volver a cargarlo y y luego tendrá un archivo jar "activo" que puede actualizar. (Si solo necesita hacer esto una vez, puede extraer, colocar el archivo que desea allí y luego cargar todo el lote en lugar de actualizarlo después).

1

Puede hacer la misma operación con el Ant jar task .

<jar duplicate="preserve" jarfile="..."> 
    your files 
</jar> 

el atributo duplicado con el valor de reserva se ocupará de las entradas duplicadas.

As mentioned here, el atributo de actualización con el valor de “preservar” Qué te dice que existen duplicados, en esta forma:

aPath/aFile already added, skipping 

Si el archivo se encuentra en la parte superior de la lista de la tarea frasco tiene que recoger acumulación tp en sí, se tendrá en cuenta su nuevo archivo.

0

Si está en OS X, pruebe la aplicación Jar Inspector. Lo usé para parchar un error de JavaScript en Wicket. Puede abrir un archivo jar y enumera todos los contenidos. Navegue hasta el archivo que desea guardar (en este caso, un archivo .js) y modifique el archivo, luego guarde el contenido, y se encarga de modificar el archivo .jar por usted. No estoy seguro si esto funcionaría con archivos .java o no.

Cuestiones relacionadas