Как Вы удаленно обновляете JAVA-приложения?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

17
задан Robert Harvey 25 November 2014 в 18:04
поделиться

8 ответов

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

Возможно, вы захотите взглянуть на jnlp - WebStart основан на этом (это технология развертывания клиентских приложений), но я вполне уверен, что он может быть адаптирован для выполнения обновлений для приложения типа сервера. Несмотря на это, jnlp довольно неплохо работает, предоставляя дескрипторы, которые можно использовать для загрузки требуемых версий требуемых JAR-файлов ...

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

  1. Рассмотрим наличие файла bootstrap.jar, который способен чтения файла jnlp и загрузки необходимых / обновленных jar-файлов перед запуском приложения.

  2. JAR-файлы можно обновлять даже во время работы приложения (по крайней мере, в Windows, и эта ОС, скорее всего, будет блокировать запущенные файлы). Вы можете столкнуться с проблемами, если используете пользовательские загрузчики классов или у вас есть несколько JAR-файлов, которые могут быть загружены или выгружены в любое время, но если вы создаете механизмы, предотвращающие это, то следует перезаписать JAR-файлы, а затем перезапустить приложение. достаточно для обновления.

  3. Даже если есть возможность перезаписать JAR-файлы, вы можете рассмотреть возможность использования пинг-понга для вашего пути к библиотеке (если у вас еще не настроена панель запуска приложения для автоматического чтения всех файлов JAR в lib и автоматически добавьте их в путь к классам, тогда это то, что вы действительно хотите сделать). Вот как работает пинг-понг:

Приложение запускает и просматривает lib-ping \ version.properties и lib-pong \ version.properties и определяет, что новее. Допустим, у lib-ping более поздняя версия. Модуль запуска ищет lib-ping * .jar и добавляет эти файлы в CP во время запуска. Когда вы делаете обновление, вы загружаете JAR-файлы в lib-pong (или копируете JAR-файлы из lib-ping, если хотите сэкономить пропускную способность, а JAR на самом деле не изменился - хотя это редко стоит усилий!). После того, как все JAR-файлы скопированы в lib-pong, самое последнее, что вы делаете, это создаете файл version.properties (таким образом прерванное обновление, которое приводит к частичной папке lib, может быть обнаружено и очищено). Наконец, вы перезапускаете приложение, и загрузчик обнаруживает, что lib-pong является желаемым путем к классу.

  1. пинг-понг, как описано выше, позволяет выполнить откат. Если вы спроектируете его должным образом, у вас может быть одна часть вашего приложения, которую вы тестируете, и затем никогда не меняете эту проверку, чтобы посмотреть, должна ли она откатывать данную версию. Таким образом, если вы все испортите и развернете что-то, что сломает приложение, вы можете сделать версию недействительной. Эта часть приложения просто должна удалить файл version.properties из плохой папки lib- *, а затем перезапустить. Важно, чтобы эта часть была очень простой, потому что она надежна.

  2. Вы можете иметь более 2 папок (вместо ping / pong, просто используйте lib-yyyymmdd и удалите все, кроме самой новой 5, например). Это допускает более продвинутый (но более сложный!) Откат JAR.

6
ответ дан 30 November 2019 в 14:01
поделиться

Необходимо определенно смотреть на OSGi, он был создан только для этих случаев (специально для встроенных продуктов) и используется большим количеством компаний. Можно обновить банку "пакеты", добавить и удалить их, в то время как приложение работает. Я не использовал его сам, таким образом, я не знаю о качестве платформ/серверов с открытым исходным кодом, но вот набор полезных ссылок для запущения Вас:

http://www.osgi.org/Main/HomePage
http://www.aqute.biz/Code/Bnd
http://blog.springsource.com/2008/02/18/creating-osgi-bundles/
http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html

4
ответ дан 30 November 2019 в 14:01
поделиться

Я рекомендовал бы Capistrano для мультиразвертывания серверов. В то время как это создается для развертывания приложений для направляющих, я видел, что это раньше успешно развертывало JAVA-приложения.

Ссылка: Capistrano 2.0 Не Только для направляющих

3
ответ дан 30 November 2019 в 14:01
поделиться

Банки не могут быть изменены, в то время как JVM работает сверху его и приведет к ошибкам. Я попробовал подобные задачи и лучшее, которое я придумал, делает копию обновленной Банки, и перейдите сценарий запуска для рассмотрения той Банки. Как только Вы имеете обновленную Банку, запускаете ее и ожидаете на старой Банке для окончания после предоставления ее сигнала сделать так. К сожалению, это означает, что потеря GUI и т.д. в течение секунды, но сериализирующий большинство структур в Java легка, и текущий GUI мог быть передан обновленному приложению перед фактическим закрытием (некоторые вещи не могут быть сериализуемыми хотя!).

2
ответ дан 30 November 2019 в 14:01
поделиться

Очень трудно сделать обновление атомарным, особенно если у Вас есть какое-либо обновление базы данных, чтобы сделать.

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

Затем, копируют Вашу установку. Теперь, у Вас есть "рабочая" версия, и у Вас есть "новая" версия.

Обновление "новая" версия с помощью любой технологии Вам нравится (FTP, rsync, перфолента, безотносительно плаваний Ваша лодка).

Проверяют Вашу установку (контрольные суммы, быстрые модульные тесты, независимо от того, что Вам нужно - даже, запускают ее на тестовом порте, если Вам нравится).

, Когда Вы довольны новой установкой, вниз исходный рабочий экземпляр, ПЕРЕИМЕНОВЫВАЮТ исходный каталог (mv приложение application_old), переименовывают каталог NEW (mv application_new приложение) и запускаются, это создает резервную копию.

Ваше время простоя уменьшается до времени закрытия и запуска сервера (так как переименовывают, "свободно").

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

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

Это может также быть сделано с гибкими ссылками вместо того, чтобы переименовать каталоги. так или иначе прекрасен.

, Но техника просто, и почти пуленепробиваем, если Ваше приложение сотрудничает.

Теперь, если у Вас есть изменения DB, ну, в общем, это - совершенно другая противная проблема. Идеально, если можно делать изменения DB "обратно совместимыми", тогда надо надеяться, старая версия приложения может работать на новой схеме, но это не всегда возможно.

2
ответ дан 30 November 2019 в 14:01
поделиться

Я полагаю, что Вы можете горячий - развертывать файлы JAR при использовании находящегося в OSGi сервера приложений как сервер SpringSource dm . Я никогда не использовал его сам, но знание общего качества портфеля Spring, я уверен, что это достойное внимания.

1
ответ дан 30 November 2019 в 14:01
поделиться

Мы используем Eclipse, который система обновления OSGi и наш опыт очень хороши.

Рекомендуемый!

0
ответ дан 30 November 2019 в 14:01
поделиться

Последняя версия Java Web Start позволяет внедрять приложение в локальный кеш без фактического вызова программы, и его можно пометить как «автономное». Поскольку для вызова программы используется кеш, он будет обновлен только для следующего запуска. Для этого вам, скорее всего, понадобятся jar-файлы с номерами версий в их имени (например, our-library-2009-06-01.jar).

0
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: