2012-04-20 4 views
24

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

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

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

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

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

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

+2

http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –

+0

См. Примеры Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –

+0

Ваше решение не позволит вам обновить оболочку, верно? – Miquel

ответ

0

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

+0

Смотрите мой комментарий к другому ответу «Веб-старт». –

+0

Понизьте избирателей, чтобы прокомментировать? –

+0

Это был не я, но я ожидаю, потому что Webstart не является решением вопроса. –

2

Посмотрите на 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

также посмотреть на этот вопрос: What's the best way to add a self-update feature to a Java Swing application?

+1

Прошу прощения. Я хотел дать понять, что это безголовые серверы, а приложение работает как фоновый демон. Это не рабочие станции. У них нет рабочей среды для настольных компьютеров, а тем более для браузера Web Start.Я посетил веб-сайт Start, но пришел к выводу, что он предназначен для доставки приложения пользователю. Это должно быть полностью автоматизировано и без присмотра. Я уточню свой вопрос, чтобы это было ясно. –

+0

Webstart может быть вызван из командной строки (не требует браузера) с помощью команды javaws: http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html –

+1

I ' я не уверен, но я думаю, что нет возможности предотвратить всплывающее всплывающее окно при использовании javaws, даже из командной строки. Для людей, желающих развернуть приложения Java, не заплатив за доверенный сертификат безопасности или тихо обновляя существующие Java-приложения, Java Web Start становится неблагоприятным. – Andy

4

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

+0

Хорошая мысль. Я считал OSGi, но есть ограничение ресурсов для рассмотрения. В контейнерах OSGi, которые я пробовал, есть значительные следы памяти, даже если у них нет пакетов. Тем не менее, я был бы рад, если бы был исправлен. –

+1

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

4

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

+0

Это лучшее лидерство, которое я видел еще, что я взял из [другого вопроса] (http://stackoverflow.com/questions/207557/whats-the-best-way-to-add-a-self-update -feature-to-a-java-swing-application), хотя я не вырыл достаточно глубоко, чтобы понять, действительно ли это соответствует моим потребностям. –

2

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

  1. запуска сценарий оболочки (.sh или .cmd), чтобы обновить свои артефакты и запустить приложение через несколько секунд паузы в скрипте (чтобы избежать два экземпляров вашей заявки одновременно).
  2. Прекратить приложения (первый экземпляр)

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

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