Come aggiorno un file Jar preesistente
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?
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.