Spring Boot инструменты разработчика: автоматический перезапуск

Приложения, использующие spring-boot-devtools, автоматически перезапускаются при изменении файлов в пути к классам (classpath). Это может быть полезно при работе в IDE, поскольку обеспечивает очень быструю обратную связь для изменений кода. По умолчанию любая запись в пути к классам, которая указывает на папку, отслеживается на предмет изменений. Обратите внимание, что определенные ресурсы, такие как статические ресурсы и шаблоны представлений, не нуждаются в перезапуске приложения.

Вызов перезапуска

Поскольку DevTools отслеживает ресурсы пути к классам, единственный способ вызвать перезапуск - обновить путь к классам. Способ обновления пути к классу зависит от используемой среды IDE. В Eclipse сохранение измененного файла приводит к обновлению пути к классам и запускает перезапуск. В IntelliJ IDEA создание проекта (Build + → + Build Project) имеет тот же эффект.

Пока включена разветвленность (создание fork'ов процесса), вы также можете запускать свое приложение с помощью поддерживаемых плагинов сборки (Maven и Gradle), поскольку DevTools для нормальной работы нужен изолированный загрузчик классов приложений. По умолчанию плагины Gradle и Maven разветвляют процесс приложения.

Автоматический перезапуск работает очень хорошо при использовании с LiveReload. Если вы используете JRebel, автоматический перезапуск отключается в пользу перезагрузки динамического класса. Другие функции devtools (такие как LiveReload и переопределения свойств) могут по-прежнему использоваться.

DevTools использует хук завершения работы контекста приложения, чтобы закрыть его во время перезапуска. Он не работает правильно, если вы отключили перехват выключения (SpringApplication.setRegisterShutdownHook(false)).

При принятии решения о том, должна ли запись в classpath вызывать перезапуск при ее изменении, DevTools автоматически игнорирует проекты с именами spring-boot, spring-boot-devtools, spring-boot-autoconfigure, spring-boot-actuator и spring-boot-starter.

DevTools необходимо настроить ResourceLoader, используемый ApplicationContext. Если ваше приложение уже предоставляет его, оно будет упаковано. Прямое переопределение метода getResource для ApplicationContext не поддерживается.

Перезапуск и перезагрузка (Restart vs Reload)

Технология перезапуска, предоставляемая Spring Boot, работает с использованием двух загрузчиков классов. Классы, которые не изменяются (например, из сторонних jar-файлов), загружаются в базовый загрузчик классов. Классы, которые вы активно разрабатываете, загружаются в загрузчик классов перезапуска. Когда приложение перезапускается, перезапускается загрузчик классов, и создается новый. Этот подход означает, что перезапуски приложений обычно выполняются намного быстрее, чем «холодные запуски», поскольку базовый загрузчик классов уже доступен и заполнен.

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки