Проблема в том, что очень маленькие изменения в источнике могут иметь очень большие изменения в сжатом файле .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).