2009-04-26 120 views
6

我使用的命令試圖更新現有的JAR文件(在這個例子中ANTLR):更新文件拋出:ZipException拋出

jar -uf antlrworks-1.2.3.jar org/antlr/codegen/templates/Java/Java.stg 

但我得到以下信息

java.util.zip.ZipException:重複條目:antlr/ANTLRError.class at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:175) at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java :92) at sun.tools.jar.Main.update(Main.java:508) 在sun.tools.jar.Main.run(Main.java:185) 在sun.tools.jar.Main.main(Main.java:1044)

任何想法?

回答

8

你正在嘗試做正確的事情,但jar文件有問題 - 它有兩個相同的條目:(:(這是合法的一個zip文件,但並不真正有用 - 正如你所看到的,它使得jar抱怨。)

如果運行

jar tvf antlrworks-1.2.3.jar > contents 

,然後查看生成的文件contents你會看到有各種重複的文件。你或許應該報告給ANTLR項目(檢查後他們不知道)

作爲一種解決方法,您可以提取jar文件的內容,再次打開它,然後,然後您將擁有一個可以更新的「正在工作」的jar文件。 (如果您只需要這樣做一次,您可以提取文件,將文件放在那裏,然後打開整個文件,而不是在之後進行更新。)

1

您可以使用Ant jar task

<jar duplicate="preserve" jarfile="..."> 
    your files 
</jar> 

具有保留值的重複屬性將負責重複條目。

As mentioned here,以「保留」的值更新屬性不告訴你,重複的存在,這種形式:

aPath/aFile already added, skipping 

如果你的文件是jar任務有所回暖TP構建名列榜首本身,你的新文件將被考慮在內。

0

如果您使用OS X,請嘗試使用Jar Inspector應用程序。我用它來修補檢票器中的一個JavaScript錯誤。您可以打開一個jar文件,並列出所有內容。導航到要保存的文件(在本例中爲.js文件)並修改文件,然後保存內容,併爲您修改.jar文件。不知道這是否適用於.java文件。