我正在尝试使用以下命令更新现有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)
有什么想法吗?
答案 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文件。