Исправление программного обеспечения Java - PullRequest
5 голосов
/ 17 сентября 2010

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

Существуют ли стандартные инструменты для определения файлов, которые были изменены, и создания для них патча?Я видел такие инструменты, как xdelta и vpatch, но я думаю, что они работают на двоичном уровне.

Я в основном хочу выяснить - какие файлы нужно добавить, заменить или удалить.Когда я запускаю патч, он проверит текущую версию программного обеспечения (из настроек реестра) и убедится, что патч для правильной версии.Если это так, то он внесет необходимые изменения.Не похоже, что это было бы слишком сложно реализовать самостоятельно, но мне было интересно, если другие люди уже сделали это.Я использую NSIS в качестве установщика, если это что-то меняет.

Спасибо,

Джефф

Ответы [ 4 ]

6 голосов
/ 18 сентября 2010

Будьте осторожны при этом - я рекомендую не делать этого вообще.

Самая большая проблема - это общедоступные статические переменные. Они на самом деле скомпилированы в цель, а не ссылки. Это означает, что даже если файл Java не изменяется, класс должен быть перекомпилирован, иначе вы все равно будете ссылаться на старое значение.

Вы также хотите быть очень осторожными при изменении сигнатур методов - вы получите некоторые очень тонкие ошибки, если вы измените сигнатуру метода и не перекомпилируете все файлы, которые вызывают этот метод - даже если вызывающие файлы Java этого не делают на самом деле нужно изменить (например, изменить параметр с int на long).

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

Редактировать (слишком долго для комментария):

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

Вы могли бы применить некоторые строгие методы разработки, не используя public final statics (сделать их приватными), а не подписи каждого изменяющегося метода (deprecate вместо), но я не уверен, что знаю все возможные проблемы, я просто знаю те, с которыми мы столкнулись.

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

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

С другой стороны, Sun, похоже, делает хорошую работу по созданию файлов классов, которые полностью совместимы с предыдущим выпуском JRE, поэтому у них где-то должны быть указания.

2 голосов
/ 18 сентября 2010

Возможно, вы захотите посмотреть, может ли Java WebStart помочь вам, поскольку он предназначен для выполнения именно тех задач, которые вы хотите делать.

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

1 голос
/ 18 сентября 2010

Как это развернуто?

В локальной сети я просто оставляю все как файлы .class в папке. Скрипт запуска использует robocopy или rsync для копирования из общей сетевой папки в локальную. Если какой-либо файл .class отличается, он синхронизируется. Если нет, он не синхронизируется.

Для нелокальной сети я создал свой собственный модуль обновления. Он загружает текстовый файл md5sums и сравнивает с локальными файлами. Если он отличается, он вытаскивает файл из http.

0 голосов
/ 18 сентября 2010

Давным-давно мы решили, как это использовать Classpath и jar-файлы. Наше приложение было построено в файле Jar, и у него был файл запуска Jar. Пусковая установка classpath содержала patch.jar, который был прочитан в classpath перед основным application.jar. Это означало, что мы можем обновить patch.jar, чтобы заменить любые классы в основном приложении.

Однако это было давно. Возможно, вам лучше использовать что-то вроде подхода Java Web Start, который предлагает более плавное обновление приложений.

...