0

2 つのファイルを追加する必要がある 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 つのファイルしかありません。私が使用していないある種の追加モードはありますか?

4

3 に答える 3

6

ええ、FileOutputStreamコンストラクターには追加のブール引数があり、ファイルを上書きするのではなく、強制的に追加することができます。コードを次のように変更します

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

そしてそれはあなたが望むように動作するはずです。

于 2008-11-05T20:12:56.983 に答える
2

これはできないようです。しばらくはと思っていたのですが、思ったほど効果がなかったようです。このようにすると、2 つの個別の jar ファイルを連結したのと同じ結果になります。奇妙な部分は、ツールがそれをある程度理解していたことです。JAR は、最初の元の jar ファイルを見つけて、それを読み上げました。Glassfish のクラスローダは、後の新しい部分を見つけていたため、追加されたファイルだけがすべてのアプリであるかのように読み込まれていました。変。

そのため、新しい戦争を作成し、古いファイルの内容を追加し、新しいファイルを追加し、閉じて、古いファイルの上に新しいファイルをコピーすることに戻りました。

于 2008-11-06T18:34:09.833 に答える
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

現在の問題にどのアプローチを使用するかはまだわかりません。

于 2010-07-20T23:11:05.477 に答える