Domanda

Ho un file WAR a cui devo aggiungere due file. Attualmente sto facendo questo:

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();

Il risultato è che i contenuti precedenti vengono bloccati: il WAR ha solo i 2 file che ho appena aggiunto in esso. Esiste una sorta di modalità append che non sto usando o cosa?

È stato utile?

Soluzione 2

Sembra che questo non possa essere fatto. Ho pensato che fosse per un po ', ma sembra che non abbia avuto l'effetto desiderato. In questo modo si è ottenuto l'equivalente di due file jar separati concatenati insieme. La parte strana era che gli strumenti avevano un senso. JAR ha trovato il primo file jar originale e me lo ha letto. Il classloader di Glassfish stava trovando la parte successiva, nuova, risultando nel caricamento di solo i file aggiunti come se fossero tutte app. Strano.

Quindi ho ripreso a creare una nuova guerra, aggiungendo il contenuto del vecchio, aggiungendo i nuovi file, chiudendo e copiando il nuovo sul vecchio.

Altri suggerimenti

Sì, c'è un ulteriore argomento booleano per costruttore FileOutputStream che ti consente di forzarlo ad aggiungere al file anziché sovrascriverlo. Cambia il tuo codice in

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

e dovrebbe funzionare nel modo desiderato.

Ho lo stesso problema; Sto cercando un modo semplice per aggiornare un file in un file jar esistente. Se è così facile fare un "jar di foo.jar ..." comando, come mai non c'è modo di usare le API Java per fare lo stesso?

Comunque, ecco la RFE per aggiungere questa funzionalità a Java; suggerisce inoltre alcune soluzioni alternative:

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

Ed ecco una libreria che pretende di renderlo molto più semplice, trattando JAR / ZIP come directory virtuali:

https: // truezip.dev.java.net

Non ho ancora capito quale approccio userò per il mio problema attuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top