Обновление файла в банке выкидывает ZipException - PullRequest
7 голосов
/ 26 апреля 2009

Я пытаюсь обновить файл в существующем jar (в этом примере antlr) с помощью команды:

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

Но я получаю следующее сообщение

java.util.zip.ZipException: повторяющаяся запись: antlr / ANTLRError.class в java.util.zip.ZipOutputStream.putNextEntry (ZipOutputStream.java:175) в java.util.jar.JarOutputStream.putNextEntry (JarOutputStream.java:92) at sun.tools.jar.Main.update (Main.java:508) at sun.tools.jar.Main.run (Main.java:185) at sun.tools.jar.Main.main (Main.java:1044)

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 26 апреля 2009

Вы пытаетесь сделать правильную вещь, но файл jar проблематичен - в него дважды входит одна и та же запись :( (Это допустимо для zip-файла, но не очень полезно - и, как вы можете видеть, оно делает jar пожаловаться.)

Если вы запустите

jar tvf antlrworks-1.2.3.jar > contents

, а затем посмотрите на сгенерированный файл contents, вы увидите, что существуют различные дубликаты файлов. Вам, вероятно, следует сообщить об этом в проект antlr (после проверки, что они еще не знают).

В качестве обходного пути вы можете извлечь содержимое файла jar, снова его собрать, и , затем у вас будет «рабочий» файл jar, который вы можете обновить. (Если вам нужно сделать это только один раз, вы можете просто извлечь, поместить туда файл, который вам нужен, а затем сжать весь лот, а не обновлять его потом.)

1 голос
/ 26 апреля 2009

Вы можете выполнить ту же операцию с задачей Ant jar .

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

атрибут дубликата со значением preserve позаботится о дубликатах записей.

Как упомянуто здесь , атрибут обновления со значением «preserve» действительно сообщает вам, что дубликаты существуют в следующей форме:

 aPath/aFile already added, skipping

Если ваш файл находится в верхней части списка, задача jar должна выбрать саму сборку tp, ваш новый файл будет учтен.

0 голосов
/ 27 апреля 2009

Если вы используете OS X, попробуйте приложение Jar Inspector . Я использовал его для исправления ошибки JavaScript в калитке. Вы можете открыть файл JAR, и он перечисляет все содержимое. Перейдите к файлу, который вы хотите сохранить (в данном случае, к файлу .js) и измените файл, затем сохраните его, и он позаботится об изменении файла .jar. Не уверен, будет ли это работать с файлами .java или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...