Перейти к основному содержимому

Обзор инструментов разработки Spring Boot

· 5 мин. чтения

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 работала, необходимо выполнить следующие шаги:

  1. Приложение, развертываемое и запускаемое на сервере, должно запускаться с включенной удаленной отладкой:
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n

Как мы видим, порт удаленной отладки здесь не упоминается. Следовательно, java выберет случайный порт

  1. Для того же проекта откройте Конфигурации запуска , выберите следующие параметры:

    Выберите основной класс: org.springframework.boot.devtools.RemoteSpringApplication

    В аргументах программы добавьте URL-адрес приложения, например, http://localhost:8080

  2. Порт по умолчанию для отладчика через приложение spring-boot — 8000, и его можно переопределить с помощью:

spring.devtools.remote.debug.local-port=8010
  1. Теперь создайте конфигурацию удаленной отладки, настроив порт как 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 , чтобы улучшить работу разработчика и сократить время разработки за счет автоматизации многих действий.