Есть что-то вроде bsdiff/Courgette для файлов jar?

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Однако - есть решение, которое должно генерировать diff и применять патчи к несжатым данным. Например:

Скажите, что у вас

Проект-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).

Ответ 4

проверить delta-updater

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