1. Введение
Spring Boot дает нам возможность быстро настраивать и запускать сервисы.
Чтобы еще больше улучшить опыт разработки, Spring выпустила инструмент spring-boot-devtools — как часть Spring Boot-1.3. В этой статье мы попытаемся осветить преимущества, которые мы можем получить, используя новую функциональность.
Мы рассмотрим следующие темы:
- Значения свойства по умолчанию
- Автоматический перезапуск
- Живая перезагрузка
- Глобальные настройки
- Удаленные приложения
1.1. Добавить Spring-Boot-Devtools в проект
Добавить spring-boot-devtools
в проект так же просто, как добавить любой другой модуль spring-boot. В существующий проект spring-boot добавьте следующую зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Сделайте чистую сборку проекта, и теперь вы интегрированы с spring-boot-devtools. Новейшую версию можно скачать отсюда, а все версии можно найти здесь .
2. Значения свойств по умолчанию
Spring-boot выполняет множество автоматических конфигураций, включая включение кэширования по умолчанию для повышения производительности. Одним из таких примеров является кэширование шаблонов, используемых механизмами шаблонов, например, thymeleaf
. Но во время разработки важнее увидеть изменения как можно быстрее.
Поведение кэширования по умолчанию можно отключить для тимелеафа,
используя свойство spring.thymeleaf.cache=false
в файле application.properties .
Нам не нужно делать это вручную, введение этого spring-boot-devtools
делает это автоматически за нас.
3. Автоматический перезапуск
В типичной среде разработки приложений разработчик должен внести некоторые изменения, построить проект и развернуть/запустить приложение, чтобы новые изменения вступили в силу, или попытаться использовать JRebel
и т. д.
С помощью spring-boot-devtools
этот процесс также автоматизирован. Всякий раз, когда файлы изменяются в пути к классам, приложения, использующие spring-boot-devtools
, вызывают перезапуск приложения. Преимущество этой функции заключается в том, что время, необходимое для проверки внесенных изменений, значительно сокращается:
19:45:44.804 ... - Included patterns for restart : []
19:45:44.809 ... - Excluded patterns for restart : [/spring-boot-starter/target/classes/, /spring-boot-autoconfigure/target/classes/, /spring-boot-starter-[\w-]+/, /spring-boot/target/classes/, /spring-boot-actuator/target/classes/, /spring-boot-devtools/target/classes/]
19:45:44.810 ... - Matching URLs for reloading : [file:/.../target/test-classes/, file:/.../target/classes/]
:: Spring Boot :: (v1.5.2.RELEASE)
2017-03-12 19:45:45.174 ...: Starting Application on machine with PID 7724 (<some path>\target\classes started by user in <project name>)
2017-03-12 19:45:45.175 ...: No active profile set, falling back to default profiles: default
2017-03-12 19:45:45.510 ...: Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@385c3ca3: startup date [Sun Mar 12 19:45:45 IST 2017]; root of context hierarchy
Как видно из журналов, поток, породивший приложение, не является основным
, а является перезапущенным
основным потоком. Любые изменения, внесенные в проект, будь то изменение java-файла, вызовут автоматический перезапуск проекта:
2017-03-12 19:53:46.204 ...: Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@385c3ca3: startup date [Sun Mar 12 19:45:45 IST 2017]; root of context hierarchy
2017-03-12 19:53:46.208 ...: Unregistering JMX-exposed beans on shutdown
:: Spring Boot :: (v1.5.2.RELEASE)
2017-03-12 19:53:46.587 ...: Starting Application on machine with PID 7724 (<project path>\target\classes started by user in <project name>)
2017-03-12 19:53:46.588 ...: No active profile set, falling back to default profiles: default
2017-03-12 19:53:46.591 ...: Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@acaf4a1: startup date [Sun Mar 12 19:53:46 IST 2017]; root of context hierarchy
4. Живая перезагрузка
Модуль spring-boot-devtools
включает встроенный сервер LiveReload, который используется для запуска обновления браузера при изменении ресурса.
Чтобы это произошло в браузере, нам нужно установить плагин LiveReload, одной из таких реализаций является Remote Live Reload для Chrome.
5. Глобальные настройки
spring-boot-devtools
предоставляет способ настроить глобальные параметры, которые не связаны с каким-либо приложением. Этот файл называется .spring-boot-devtools.properties
и находится в $HOME.
6. Удаленные приложения
6.1. Удаленная отладка через HTTP (удаленный туннель отладки)
spring-boot-devtools
предоставляет готовые возможности удаленной отладки через HTTP, для использования этой функции требуется, чтобы spring-boot-devtools был
упакован как часть приложения. Этого можно добиться, отключив конфигурацию excludeDevtools
в плагине в maven.
Вот краткий пример:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
Теперь, чтобы удаленная отладка через HTTP работала, необходимо выполнить следующие шаги:
- Приложение, развертываемое и запускаемое на сервере, должно запускаться с включенной удаленной отладкой:
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n
Как мы видим, порт удаленной отладки здесь не упоминается. Следовательно, java выберет случайный порт
Для того же проекта откройте
Конфигурации запуска
, выберите следующие параметры:Выберите основной класс:
org.springframework.boot.devtools.RemoteSpringApplication
В аргументах программы добавьте URL-адрес приложения, например,
http://localhost:8080
Порт по умолчанию для отладчика через приложение spring-boot — 8000, и его можно переопределить с помощью:
spring.devtools.remote.debug.local-port=8010
- Теперь создайте конфигурацию удаленной отладки, настроив порт как 8010 в соответствии с настройками через свойства или 8000 , если придерживаться значений по умолчанию.
Вот как будет выглядеть журнал:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: (v1.5.2.RELEASE)
2017-03-12 22:24:11.089 ...: Starting RemoteSpringApplication v1.5.2.RELEASE on machine with PID 10476 (..\org\springframework\boot\spring-boot-devtools\1.5.2.RELEASE\spring-boot-devtools-1.5.2.RELEASE.jar started by user in project)
2017-03-12 22:24:11.097 ...: No active profile set, falling back to default profiles: default
2017-03-12 22:24:11.357 ...: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@11e21d0e: startup date [Sun Mar 12 22:24:11 IST 2017]; root of context hierarchy
2017-03-12 22:24:11.869 ...: The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2017-03-12 22:24:11.949 ...: LiveReload server is running on port 35729
2017-03-12 22:24:11.983 ...: Started RemoteSpringApplication in 1.24 seconds (JVM running for 1.802)
2017-03-12 22:24:34.324 ...: Remote debug connection opened
6.2. Удаленное обновление
Удаленный клиент отслеживает изменения пути к классам приложения, как это делается для функции удаленного перезапуска. Любое изменение пути к классам приводит к тому, что обновленный ресурс передается удаленному приложению, и запускается перезапуск.
Изменения вносятся, когда удаленный клиент запущен и работает, поскольку мониторинг измененных файлов возможен только в этом случае.
Вот как это выглядит в логах:
2017-03-12 22:33:11.613 INFO 1484 ...: Remote debug connection opened
2017-03-12 22:33:21.869 INFO 1484 ...: Uploaded 1 class resource
7. Заключение
В этой быстрой статье мы только что продемонстрировали, как мы можем использовать модуль spring-boot-devtools
, чтобы улучшить работу разработчика и сократить время разработки за счет автоматизации многих действий.