【问题标题】:How do I update a pre-existing Jar file如何更新预先存在的 Jar 文件
【发布时间】:2010-09-20 22:51:34
【问题描述】:

我有一个需要添加两个文件的 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 个文件。是否有某种我没有使用的附加模式或什么?

【问题讨论】:

    标签: java jar


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这似乎是做不到的。我以为是有一段时间了,但似乎并没有达到我想要的效果。这样做相当于将两个单独的 jar 文件连接在一起。奇怪的是,这些工具能理解它。 JAR 找到了第一个原始的 jar 文件并读给我看。 Glassfish 的类加载器正在寻找后来的新部分,导致它只加载添加的文件,就好像它们是整个应用程序一样。很奇怪。

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

      【讨论】:

        【解决方案3】:

        我也有同样的问题;我正在寻找一种简单的方法来更新现有 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

        我还没有弄清楚我要使用哪种方法来解决当前的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-09
          • 2017-12-02
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 2011-09-28
          相关资源
          最近更新 更多