2009-04-26 248 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文件。