Pregunta

Tengo un archivo WAR al que necesito agregar dos archivos. Actualmente, estoy haciendo esto:

File war = new File(DIRECTORY, "server.war");
JarOutputStream zos = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(war)));

//Add file 1
File file = new File(DIRECTORY, "file1.jar");
InputStream is = new BufferedInputStream(new FileInputStream(file));
ZipEntry e = new ZipEntry("file1.jar");
zos.putNextEntry(e);
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf, 0, buf.length)) != -1) {
    zos.write(buf, 0, len);
}
is.close();
zos.closeEntry();

//repeat for file 2

zos.close();

El resultado es que los contenidos anteriores se ven afectados: WAR solo tiene los 2 archivos que acabo de agregar. ¿Hay algún tipo de modo de agregar que no estoy usando o qué?

¿Fue útil?

Solución 2

Parece que esto no se puede hacer. Pensé que era por un tiempo, pero parece que no estaba teniendo el efecto que quería. Hacerlo de esta manera resultó en el equivalente de dos archivos jar separados concatenados juntos. La parte extraña fue que las herramientas le daban sentido. JAR encontró el primer archivo jar original y me lo leyó. El cargador de clases de Glassfish estaba encontrando la nueva parte posterior, lo que resultaba en que cargaba solo los archivos agregados como si fueran todos de la aplicación. Extraño.

Así que volví a crear una nueva guerra, agregando el contenido de la antigua, agregando los nuevos archivos, cerrando y copiando la nueva sobre la anterior.

Otros consejos

Sí, hay un argumento booleano adicional para FileOutputStream constructor que le permite forzarlo a agregar al archivo en lugar de sobrescribirlo. Cambia tu código a

JarOutputStream zos = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(war, True)));

y debería funcionar de la manera que desee.

Tengo el mismo problema; Estoy buscando una manera fácil de actualizar un archivo en un archivo jar existente. Si es tan fácil hacer un `` jar uf foo.jar ... '' comando, ¿cómo es que no hay una manera de usar las API de Java para hacer lo mismo?

De todos modos, aquí está el RFE para agregar esta funcionalidad a Java; También sugiere algunas soluciones:

http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 4129445

Y aquí hay una biblioteca que pretende hacer esto mucho más fácil, tratando los JAR / ZIP como directorios virtuales:

https: // truezip.dev.java.net

Todavía no he descubierto qué enfoque voy a utilizar para mi problema actual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top