Подтвердить что ты не робот

Как сделать самообновление Java-приложения?

Проблема. У меня есть автономное приложение Java (отныне известное как "агент" ), которое работает как служба на внутренних серверах компании. Он действует как удаленный агент для некоторых центральных серверов. По мере развертывания агента в других местах управление ими становится все более сложным. В частности: толкание обновлений является болезненным, потому что это довольно ручной процесс и получение доступа к журналам и другой информации о средах, где работают агенты, является проблематичным, что затрудняет отладку. Обсуждаемые серверы безгласны и без внимания, что означает, что это должен быть полностью автоматический процесс без ручного вмешательства, поэтому Java Web Start не является жизнеспособным решением.

Предлагаемое решение. Периодически отправляйте домашний телефон агента (на центральные серверы) для предоставления статуса агента и проверки обновлений.

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

То, что я придумал, на самом деле представляет собой отдельный проект, который действует как обертка для агента. Обертка периодически вызывает центральный сервер через HTTP, чтобы проверить обновленную версию агента. Найдя обновление, он загружает новую версию, завершает работу агента и запускает новую. Если это кажется нечетным или окольным решением, вот несколько других соображений/ограничений, которые стоит отметить:

  • Когда оболочка получает новую версию агента, могут быть новые зависимости JAR, что означает изменение пути к классу, то есть я, вероятно, хочу создать отдельный процесс Java вместо того, чтобы возиться с ClassLoaders и подвергать риску постоянную память утечка, которая потребует ручного вмешательства - именно то, от чего я пытаюсь убежать. Вот почему у меня появился отдельный "оберточный" процесс для управления обновлениями агента в моем прототипе.
  • Некоторые серверы, на которых развертываются агенты, ограничены ресурсами, поэтому любое решение должно быть низким при использовании ЦП и памяти. Это заставляет меня хотеть решение, которое не связано с разворачиванием новой JVM, и это удар против наличия отдельного процесса обертки.
  • Агент уже развернут как на серверах Windows, так и на RHEL, поэтому решение должно быть кросс-платформенным, хотя у меня не будет проблемы с дублированием разумного объема процесса в пакетных и bash сценариях.

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

4b9b3361

Ответ 1

Если ваше приложение основано на OSGi, вы можете позволить OSGi обрабатывать обновления пакетов для вас. Это похоже на предложенный вами метод обертки, поскольку сам контейнер OSGi является "оболочкой", и некоторые из них не будут обновляться. Здесь обсуждение this

Ответ 2

Разное решение: используйте (и платите за) install4j. Ознакомьтесь с функциями автоматического обновления здесь

Ответ 3

Посмотрите на Java Web Start.

Это технология, которая была частью Java с... 1.5? возможно 1,4? и позволяет развертывать и устанавливать автономные приложения на основе Java через веб-браузер. Он также позволяет вам всегда запускать последнее приложение.

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

также см. этот вопрос: Каков наилучший способ добавить функцию самообновления в приложение Java Swing?

Ответ 4

Нет необходимости в обертке (сохранить память) или в java web start (добавляет больше ограничений на ваше приложение), просто дайте потоку в вашем приложении периодически проверять обновления (например, из облака) и загружать обновления, если они есть, а затем код этих двух вызовы в вашем приложении:

  • запустите оболочку script (.sh или .cmd), чтобы обновить ваши артефакты и запустить приложение через несколько секунд в паузе script (во избежание одновременного использования двух экземпляров вашего приложения).
  • Завершите свое приложение (первый экземпляр)

script может перезаписать необходимые артефакты и заново запустить ваше приложение.

наслаждайтесь!

Ответ 5

Кажется, что Webstart - единственный способ сделать это в данный момент.