Введение

JUpdater – это проект, целью которого является создание утилиты, позволяющей разработчикам быстро внедрять проверку версий в Java-приложения. Утилита обеспечивает уведомление пользователя о новых версиях и позволяет легко обновляться до последней версии непосредственно из приложения, без каких-либо дополнительных действий. Утилита загружает только те файлы, которые устарели, экономя трафик. JUpdater состоит из двух частей: небольшого Java-клиента, который легко интегрируется в существующие программы, и серверной части на PHP, которая отслеживает версии и предоставляет клиенту всю необходимую информацию. Проект находится в стадии разработки и может содержать ошибки. Любое приложение, которое должно обновляться через JUpdater, должно быть упаковано в JAR-файл.

Клиент

Небольшой набор классов, клиент JUpdater, необходимо добавить в программы, чтобы они могли сравнивать свои версии с центральным сервером. Клиенту требуется JRE 1.5 или выше. Клиент предоставляет три основные функции: обновление указанного JAR-файла путем сравнения MD5-контрольных сумм всех файлов (это выполняется в несколько этапов, описанных ниже); проверка наличия новой версии на сервере с использованием атрибута Implementation-Version в манифесте JAR; проверка наличия новой версии и получение соответствующего журнала изменений, также с использованием атрибута Implementation-Version. Для отслеживания процесса обновления может быть реализован интерфейс. Эту информацию можно, например, отображать в графическом пользовательском интерфейсе.

Сервер

JUpdater требует центральный сервер, содержащий информацию о последней версии. Клиенты подключаются к серверу для проверки наличия новых версий и загрузки обновлений и журнала изменений. Для работы сервера требуется PHP версии 4.3 или выше и MySQL версии 4.0 или выше.

Как работает обновление

Вот подробное описание того, что на самом деле происходит за кулисами при выполнении полной проверки обновлений. Метод `updateJar` экземпляра `JUpdater` вызывается с именем файла JAR для обновления и соответствующим именем программы. Клиент открывает соединение с сервером и отправляет имя программы (через HTTP Post). Сервер устанавливает сеанс и отвечает идентификатором сеанса и URL-адресом JAR-файла сервера для этой программы. С этого момента клиент и сервер находятся в сеансе, и сервер, следовательно, запоминает, какую программу клиент хочет обновить во время всех последующих запросов, связанных с этим конкретным обновлением. Клиент сохраняет ответ сервера и отправляет запрос на список файлов JAR-файла сервера через XML RPC. Сервер отвечает списком (взятым из базы данных сервера). Клиент вычисляет контрольные суммы MD5 для всех локальных файлов, которые он может найти (просматривая список файлов с сервера), остальным присваивается контрольная сумма 0. Затем клиент отправляет результат на сервер (через XML RPC). Сервер проверяет все контрольные суммы MD5 с записями в базе данных и возвращает список всех файлов, для которых контрольные суммы не совпадают (то есть список всех устаревших файлов). Для каждого устаревшего файла обратно отправляется следующий массив: [имя файла, размер, корректная MD5] (все эти данные считываются из базы данных). Если ничего не устарело, клиент останавливается здесь, иначе продолжает работу. Клиент запрашивает журнал изменений с сервера (через XML RPC). Сервер отвечает всеми изменениями (внесенными администратором) между версиями клиента и последней версией. Клиент отображает изменения и спрашивает слушателя через `shouldStartDownloading`, следует ли загружать файлы. Если метод возвращает `false`, клиент останавливается здесь, иначе продолжает работу. Клиент начинает загружать устаревшие файлы один за другим во временное хранилище. Для каждого файла клиент вычисляет контрольную сумму MD5 и убеждается, что она совпадает, иначе повторяет попытку (пока не исчерпает число попыток). Клиент начинает процесс исправления после загрузки всех устаревших файлов. Он копирует актуальные файлы текущего JAR-файла в новый JAR-файл, а затем записывает загруженные файлы в этот JAR-файл. После успешного завершения без ошибок он заменяет старый JAR-файл на обновленный, завершая тем самым обновление.