如何更新预先存在的Jar文件

时间:2008-11-05 19:58:49

标签: java jar

我有一个WAR文件,我需要添加两个文件。目前,我这样做:

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

结果是先前的内容被破坏了:WAR只有我刚刚添加的2个文件。是否有某种追加模式,我没有使用或什么?

3 个答案:

答案 0 :(得分:6)

是的,FileOutputStream constructor有一个额外的布尔参数,它允许你强制它附加到文件而不是覆盖它。将您的代码更改为

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

它应该按照你想要的方式工作。

答案 1 :(得分:2)

似乎无法做到这一点。我认为它已经有一段时间了,但它似乎并没有达到我想要的效果。这样做会导致相当于两个单独的jar文件连接在一起。奇怪的是,工具正在对它有所了解。 JAR找到了第一个原始的jar文件,然后读了我一遍。 Glassfish的类加载器正在寻找后来的新部件,导致它只加载添加的文件,就好像它们都是应用程序一样。怪异。

所以我决定创建一个新的战争,添加旧的内容,添加新文件,关闭,并复制旧的旧文件。

答案 2 :(得分:0)

我有同样的问题;我正在寻找一种简单的方法来更新现有jar文件中的文件。如果执行“jar uf foo.jar ...”命令很容易,那么为什么没有办法使用Java API来做同样的事情呢?

无论如何,这是将此功能添加到Java的RFE;它还提出了一些解决方法:

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

这里有一个库,声称通过处理虚拟目录之类的JAR / ZIP来使这更容易:

https:// truezip.dev.java.net

我还没想出我将用于解决当前问题的方法。