Есть ли что-то вроде bsdiff / Courgette для jar-файлов? - PullRequest
15 голосов
/ 30 марта 2010

Google использует bsdiff и Courgette для исправления двоичных файлов, таких как дистрибутив Chrome. Существуют ли аналогичные инструменты для исправления файлов JAR?

Я обновляю jar-файлы удаленно через соединение с ограниченной пропускной способностью и хотел бы минимизировать объем отправляемых данных. У меня есть некоторый контроль над клиентским компьютером в некоторой степени (то есть я могу запускать сценарии локально), и я гарантирую, что целевое приложение не будет работать в данный момент.

Я знаю, что я могу исправлять Java-приложения, помещая обновленные файлы классов в classpath, но я бы предпочел более чистый метод для выполнения обновлений. Было бы хорошо, если бы я мог начать с целевого файла jar, применить бинарный патч, а затем получить обновленный файл jar, идентичный (поразрядно) новому jar (из которого был создан патч).

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Попробуйте javaxdelta проект на Sourceforge. Это должно позволить создавать патчи и применять их.

[EDIT] Этот инструмент еще не существует. Откройте файл JAR с помощью обычных инструментов, а затем используйте javaxdelta, чтобы создать один патч для каждой записи в JAR. Заархивируйте их и скопируйте на сервер.

С другой стороны, вам нужно установить небольшой исполняемый JAR, который принимает патч и JAR-файл в качестве аргументов и применяет патч. Вам тоже придется написать этот, но это не займет много времени.

1 голос
/ 25 мая 2011

Проблема в том, что очень маленькие изменения в источнике могут иметь очень большие изменения в сжатом файле .JAR.

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

Однако - существует решение, которое заключается в создании различий и применении патчей к несжатым данным . Например:

Скажем, у вас есть

проект-v1.jar

проект-v2.jar

Генерация разницы между этими двумя файлами, вероятно, будет огромной, хотя внутренние изменения могут быть очень маленькими. Скажем, у нас есть программа «unjar» и «rejar» - мы можем сгенерировать

project-v1.jar -> project-v1.jar.unjar

project-v2.jar -> project-v2.jar.unjar

Затем выполните различия между файлами unjar, чтобы сгенерировать патч. Чтобы применить патч будет

project-v1.jar (unjar) -> project-v1.jar.unjar - (применить исправление) -> project-v1.patched.unjar (rejar) -> project-v1.patched.jar

По сути, программы «unjar» (и «rejar» - наоборот) должны брать исходный ZIP-файл (или любой другой тип файла) и распаковывать содержимое, включая заголовки, атрибуты и любые другие детали, до поток вывода (вместо создания отдельных файлов).

Это не должен быть очень сложный фильтр для записи. Дополнительным бонусом было бы сделать это с учетом сжатия и рекурсивным (чтобы вы могли применить его, например, к файлу WAR).

1 голос
/ 31 марта 2010

.jar файлы уже сжаты, так что вам действительно нужно сжатие, которое хорошо работает с zip-файлами;). Если вы доберетесь до этого за 1001 * до , когда вы положите его в банку, у вас будет больше шансов воспользоваться тем знанием, что это "ява", я ожидаю. Я подозреваю, что вы могли бы адаптировать факторизацию, описанную в этой статье , в качестве метода сжатия, специфичного для Java.

0 голосов
/ 23 июня 2015

чек дельта-апдейтер

это сборка для двоичных каталогов diff и patching, вы можете использовать IOFilter для фильтрации включенных файлов

...