2008-11-05 55 views
0

我有一個WAR文件,需要添加兩個文件。目前,我正在這樣做:如何更新預先存在的Jar文件

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個文件。有沒有某種附加模式,我不使用或什麼?

回答

2

看來這不能做到。我認爲這是一段時間,但它似乎並沒有產生我想要的效果。這樣做導致兩個獨立的jar文件相互連接在一起。奇怪的是,這些工具正在對它有所瞭解。 JAR找到了第一個原始的jar文件,並將它讀給我。 Glassfish的類加載器正在尋找更新的部分,導致它僅加載添加的文件,就好像它們都是應用程序一樣。奇怪的。

所以我重新建立了一場新的戰爭,增加了舊的內容,添加新的文件,關閉和複製新的舊的。

5

是的,有一個額外的布爾參數FileOutputStream constructor它可以讓你強制它追加到文件,而不是覆蓋它。將您的代碼更改爲

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

它應該按照您想要的方式工作。

0

我有同樣的問題;我正在尋找一種簡單的方法來更新現有jar文件中的文件。如果執行「jar uf foo.jar ...」命令很容易,那麼如何使用Java API來執行相同的操作?

無論如何,這裏是RFE將此功能添加到Java;它也提出了一些變通:

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

這裏是一個據說可以使這個輕鬆了許多,由治療的JAR/ZIP探頭就像虛擬目錄庫:

https://開頭truezip。 dev.java.net

我還沒有想出這辦法我會用我當前的問題。

相關問題