Файлы JAR: почему при извлечении и сжатии файла JAR создается файл, размер которого отличается от исходного? - PullRequest
1 голос
/ 07 марта 2012

Я пытался редактировать один байт в извлеченном файле jar плагина Eclipse.Я заметил, что после повторного сжатия файлов в виде файла jar результирующий файл был больше исходного (всего 1%) и плагин не работал.Eclipse загрузился, но тихо выключился после выбора рабочей области.Откат к исходному плагину позволил ему успешно запуститься.

Затем я попытался распаковать, затем сжать плагин (ничего не меняя), и результирующий файл JAR был все еще больше, чем исходный, и также не работал.

$ jar -xf temp/in.jar

затем

$ jar -cf out.jar temp/*

$ du in.jar out.jar
4216    in.jar
4236    out.jar

Я думаю, это может быть связано с изменением меток времени, но я не думал, что это помешает затмению принять его.

Итак, мой вопрос: есть ли способ распаковать банку, изменить байт и сжать ее, не меняя банку?

Я использую Ubuntu 10.04 - 64 бит:

Linux user 2.6.32-38-generic #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012 x86_64 GNU/Linux

При взгляде на стол банки виден другой порядок:

$ jar tf in.jar | head -n 5
META-INF/
META-INF/MANIFEST.MF
com/
com/android/
com/android/ide/

$ jar tf out.jar | head -n 5
META-INF/
META-INF/MANIFEST.MF
about.html
about.ini
about.properties

Есть ли способ заказать их по-другому в банке?

1 Ответ

3 голосов
/ 13 марта 2012

Получение другого размера после повторного сжатия нормально, если один файл был изменен.Но если ничего не было изменено, возможно, у вас нет одного и того же корневого каталога в обоих архивах.

Запустите следующие две команды и опубликуйте результат здесь (только первые строки):

jar tf in.jar
jar tf out.jar

Эти команды выводят список всех файлов в файлах Jar с указанием их пути.

Вы пытались обновить только измененный файл, используя следующую команду:

jar uf in.jar TheFileYouModified

TheFileYouModified должен иметь тот же путьв файле JAR.Например, чтобы заменить com / android / Example.class, который вы извлекли в / tmp / injar / и изменили:

jar uf in.jar -C /tmp/injar com/android/Example.class
...