Spring BootのHot Swapping設定

最近Spring Bootに入門しまして、Hot Swappingを設定しようとして調べていたら、記事によって若干情報が古かったり設定が足りなかったりして意外と苦戦したので、ここにまとめておきます。

## 環境情報
- Mac
- IntelliJ IDEA 2019.1.2 (Community Edition)
- Spring Boot Gradle Plugin 2.1.4
- Spring Boot Devtools 2.1.4

## 設定手順
Preferencesで`Build project automatically`にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/8ecf70ab-3806-0a1d-edd0-fb2cfc3f0830.png)

`Shift+Command+A`でコマンド検索ウィンドウを表示し、`Registry...`を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/72234289-e2d3-0f2d-6876-b3af65a6daad.png)

`compiler.automake.allow.when.app.running`にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/a1b70164-9125-6700-df90-8df549576ef4.png)

`build.gradle`で以下の設定を追加します。

```gradle
bootRun {
    sourceResources sourceSets.main
}
```

`application.properties`に以下を追加します(テンプレートエンジンにThymeleafを使用している場合)。

```properties
spring.thymeleaf.cache = false
```

## リロードの動きについて
例えば、`src/main/java/hello/GreetingController.java`のソースに変更を加えると、アプリケーションがリロードされます。
自分の環境ではリロードが走るにはソースファイルを`Command+S`で保存してあげる必要がありました。

```
...
サービスがシャットダウンされた
2019-05-24 16:18:26.310  INFO 37740 --- [      Thread-33] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

アプリが再起動した
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.4.RELEASE)

2019-05-24 16:18:31.397  INFO 37740 --- [  restartedMain] hello.Application                        : Starting Application on xxx.local with PID 37740 (/Users/takehiro/Documents/git/sprint-web-mvc/build/classes/java/main started by takehiro in /Users/user/Documents/git/sprint-web-mvc)
2019-05-24 16:18:31.398  INFO 37740 --- [  restartedMain] hello.Application                        : No active profile set, falling back to default profiles: default
2019-05-24 16:18:31.563  INFO 37740 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
...
```

また、静的ファイルである`src/main/resources/templates/greeting.html`に変更を加えたときは、ブラウザをリロードすることで反映されました。
こちらの場合アプリケーションのリロードは発生しませんでした。

## ライブリロード
ブラウザのLiveReloadエクステンションと組み合わせることで、いちいちブラウザのリロードボタンをクリックしなくても自動でリロードをさせることができるようになります。
これはSpring Boot DevtoolsにLiveReloadサーバーが組み込まれているためです。

エクステンションは[こちら](http://livereload.com/extensions/)からインストールできます。

先にアプリケーションを起動しておき、ブラウザで画面を表示します。
LiveReloadエクステンションのアイコンをクリックし、ステータスが`LiveReload is connected, click to disable`になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/a7bf3658-0ae6-1238-6ca1-59ae77fae464.png)

これでライブリロードが実現されます。

![livereload.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/12d61bf8-483d-414a-409b-8bd860725402.gif)


## 参考
- [Spring boot devtools - Static content reloading does not work in IntelliJ
](https://stackoverflow.com/questions/35895730/spring-boot-devtools-static-content-reloading-does-not-work-in-intellij/35895848#35895848)
- [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.0.0.M3//gradle-plugin/reference/html/#running-your-application-reloading-resources)
- [Spring Boot Reference Guide](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-hotswapping)
- [How do I install and use the browser extensions?](http://livereload.com/extensions/)