2008-11-05 7 views
0

J'ai un fichier WAR sur lequel j'ai besoin d'ajouter deux fichiers. À l'heure actuelle, je fais ceci:Comment mettre à jour un fichier Jar préexistant?

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

Le résultat est que le contenu précédent faussés: la guerre n'a que les 2 fichiers que je viens d'ajouter en elle. Y at-il une sorte de mode d'ajout que je n'utilise pas ou quoi?

Répondre

2

Il semble que cela ne puisse pas être fait. Je pensais que c'était pour un moment, mais il semble que ce n'était pas tout à fait l'effet que je voulais. Le faire de cette façon a abouti à l'équivalent de deux fichiers Jar distincts concaténées ensemble. La partie étrange était que les outils avaient un sens. JAR a trouvé le premier fichier Jar original et m'a lu ça. Le classloader de Glassfish était en train de trouver la nouvelle partie, la chargeant de charger uniquement les fichiers ajoutés comme s'ils étaient tous de l'application. Bizarre. J'ai donc resurgi à la création d'une nouvelle guerre, en ajoutant le contenu de l'ancien, en ajoutant les nouveaux fichiers, en fermant, et en copiant le nouveau par-dessus l'ancien.

5

Oui, il y a un argument booléen supplémentaire au FileOutputStream constructor qui vous permet de forcer l'ajout au fichier plutôt que de l'écraser. Changez votre code pour

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

et il devrait fonctionner comme vous le souhaitez.

0

J'ai le même problème; Je cherche un moyen facile de mettre à jour un fichier dans un fichier jar existant. Si c'est si facile de faire une commande "jar uf foo.jar ...", comment se fait-il qu'il n'y ait pas moyen d'utiliser les API Java pour faire de même?

Quoi qu'il en soit, voici la RFE pour ajouter cette fonctionnalité à Java; il suggère aussi quelques contournements:

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

Et voici une bibliothèque qui prétend en faire beaucoup plus facile, en traitant JARs/ZIPs comme des répertoires virtuels:

https: // truezip. dev.java.net

Je n'ai pas encore compris quelle approche je vais utiliser pour mon problème actuel.

Questions connexes