- Хроники
- Interlude
- Исходники
- Отсутствуют
- Сборка
- любая java compiled
Допустим у нас есть скомпилированная активно развивающаяся сборка ядра, которая поставляется в скомпилированном виде(и это устраивает исходники не нужны), не signed. Мы можем декомпилировать, поправить необходимые нам вещи и запатчить обратно. Потом выйдет новая версия и придется повторять патч.
Если я правильно понял, то от компиляции к компиляции байткод особо не меняется и с помощью JarDiff можно отслеживать были ли изменения в пропатченых файлах и только в этом случае мерджить руками и пересобирать класс, иначе просто закидываем старые патченные классы обратно.
В моей голове путь автоматизации примерно такой(используя существующие тулы):
1. Репозиторий с VCS, допустим git, в котором будем держать 2 ветки, допустим patched, original. В ветке original лежит core.jar, в ветке patched лежит core.jar, core.patched.jar и папка patch, которая повторяет внутреннюю структуру jar файла и содержит только измененные .class файлы.
2. В ветку original заливается обновленный jar файл.
3. Дергаем скрипт(руками или хуком), который:
- переключаемся на ветку patched
- копируем core.jar(для diff) и делаем merge изменений из original
- получает список diff классов из jarников (jardiff)
- получаем список файлов из папки patch
- сравниваем списки, если есть конфликты, то декомпилируем конфликтные файлы и с помощью merge-file накладываем изменения в папку patch, собираем. Если есть конфликты, то алертим и дальше проходим по всем файлам с последующим выходом из скрипта.
- копируем с заменой core.jar в core.patched.jar и применяем все файлы из папки patch на jar. ( jar uf core.jar com\core\Test.class )
- подчищаем все от временных файлов
4. коммитим изменения и получаем перепропатченый core.patched.jar от обновленного core.jar
Тут кажется есть проблемы, после декомпиляции и попытки merge чаще всего будут конфликты просто из-за нейминга переменных после декомпилятора
С java на вытянутых руках и не знаю верны ли мои выводы или подход. Подскажите как вы решаете подобные проблемы(если вообще решаете) или может я в чем-то с ходу не прав? Решение выглядит накрученным
Если я правильно понял, то от компиляции к компиляции байткод особо не меняется и с помощью JarDiff можно отслеживать были ли изменения в пропатченых файлах и только в этом случае мерджить руками и пересобирать класс, иначе просто закидываем старые патченные классы обратно.
В моей голове путь автоматизации примерно такой(используя существующие тулы):
1. Репозиторий с VCS, допустим git, в котором будем держать 2 ветки, допустим patched, original. В ветке original лежит core.jar, в ветке patched лежит core.jar, core.patched.jar и папка patch, которая повторяет внутреннюю структуру jar файла и содержит только измененные .class файлы.
2. В ветку original заливается обновленный jar файл.
3. Дергаем скрипт(руками или хуком), который:
- переключаемся на ветку patched
- копируем core.jar(для diff) и делаем merge изменений из original
- получает список diff классов из jarников (jardiff)
- получаем список файлов из папки patch
- сравниваем списки, если есть конфликты, то декомпилируем конфликтные файлы и с помощью merge-file накладываем изменения в папку patch, собираем. Если есть конфликты, то алертим и дальше проходим по всем файлам с последующим выходом из скрипта.
- копируем с заменой core.jar в core.patched.jar и применяем все файлы из папки patch на jar. ( jar uf core.jar com\core\Test.class )
- подчищаем все от временных файлов
4. коммитим изменения и получаем перепропатченый core.patched.jar от обновленного core.jar
Тут кажется есть проблемы, после декомпиляции и попытки merge чаще всего будут конфликты просто из-за нейминга переменных после декомпилятора
С java на вытянутых руках и не знаю верны ли мои выводы или подход. Подскажите как вы решаете подобные проблемы(если вообще решаете) или может я в чем-то с ходу не прав? Решение выглядит накрученным
Последнее редактирование: