更新jar中的文件会抛出ZipException

时间:2009-04-26 07:39:59

标签: java jar

我正在尝试使用以下命令更新现有jar中的文件(在此示例中为antlr):

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)           在sun.tools.jar.Main.update(Main.java:508)           在sun.tools.jar.Main.run(Main.java:185)           在sun.tools.jar.Main.main(Main.java:1044)

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

你正在尝试做正确的事情,但jar文件有问题 - 它有两次相同的条目:((这对于zip文件是合法的,但不是真的有用 - 而且正如你所看到的,它使得jar抱怨。)

如果你跑

jar tvf antlrworks-1.2.3.jar > contents

然后查看生成的contents文件,您会看到有各种重复文件。您应该将此报告给antlr项目(在检查后他们还不知道)。

作为一种解决方法,您可以提取jar文件的内容,再次将其设置为jar,然后然后您将拥有一个可以更新的“工作”jar文件。 (如果你只需要这样做一次,你可以提取,把你想要的文件放在那里,然后将整个罐子装罐,而不是事后更新。)

答案 1 :(得分:1)

您可以使用Ant jar task执行相同的操作。

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

具有保留值的重复属性将处理重复的条目。

As mentioned here,值为“preserve”的update属性会以这种形式告诉您存在重复项:

 aPath/aFile already added, skipping

如果您的文件位于列表顶部,则jar任务必须选择tp构建本身,您的新文件将被考虑在内。

答案 2 :(得分:0)

如果您使用的是OS X,请尝试使用Jar Inspector应用程序。我用它来修补wicket中的javascript错误。您可以打开一个jar文件,它会列出所有内容。导航到要保存的文件(在本例中为.js文件)并修改文件,然后保存内容,并负责修改.jar文件。不确定这是否适用于.java文件。