Spring Boot + Gradle on Intellij IDEA でアプリケーション実行中にコードの変更反映と Thymeleaf テンプレートの変更反映

これまではずっとEclipse(STS) + Mavenでわいわいコード書いて過ごしてきたんだけど、最近IntelliJ IDEA使い始めたうえに、MavenじゃなくてGradle使い始めて、頭で考えたことがそのまま手に繋がらなくてぐぬぬってなりながらコード書いてる。まぁ、それ自体は楽しんでる。

んで、どうやったらいいんだろう?って思ったのが

変更が反映されない

ってこと。次の2つ。アプリを起動(bootRun)してる状態で

  1. コードを変更してもDevToolsがリロードしてくれない
  2. Thymeleafのテンプレートの変更が反映されない

結論から言うと

どちらも解決しました。で、コードの変更の方はDevToolsだけじゃなくて、SpringLoadedというものもあるって教えていただいたんですけど、最終的にはDevToolsにすることにしました。

つぶやき

STSのときはどっちも大丈夫だったんだけど、IntelliJだとそういうもんなのかなぁ?いやー、そんなことないよなぁ?と思いつつ、つぶやき。

そしたらしおしおさんが「昔のやつなので、今できるかは分からないですが」ってコメントつきでSpringLoadedを教えてくれました。(∩´∀`)∩ワーイありがとうございます!SpringLoadedって全然知らなかったんだけど、アプリを再起動せずにHotReloadしてくれるみたいで便利そうだなー。

siosio.hatenablog.com

んで、DevToolsとかSpringLoadedとかをごにょごにょしながら「んむーうごかんー」とかしばらく戦ったのですが。

DevToolsとかSpringLoadedとかを使うときには

どちらのツールも、この2つの設定をすれば動きました。変更したときに自動でビルドする設定。

まずは "Build project automatically"

f:id:bufferings:20170724002546p:plain

んで、もういっこ。上記のままだと、IDEAからbootRunでアプリを起動してるときにはビルドが走らないのでそれを有効にしてあげた。

参考: Intellij IDEA – Spring boot template reload is not working

Help > Find Action... から、"Registry" って打って出てきたやつで "compiler.automake.allow.when.app.running" にチェック

f:id:bufferings:20170724003032p:plain

あとは、それぞれのツールの説明を見ながら動かせばOK。

spring-boot-devtools: http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-reload-static-content

SpringLoaded: http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-reload-springloaded-gradle-and-intellij-idea

SpringLoadedの方が反映は早いんだけど、spring-boot-devtoolsの再起動するって方がなんとなく好きなのと、spring-boot-devtoolsが有効なときはThymeleafのキャッシュが自動でoffになるので、spring-boot-devtoolsを使ってみることにしました。SpringBootのドキュメントにもおすすめって書いてあるしね。

(spring-boot-devtoolsを使ってないときは、自分でapplication.propertiesでspring.thymeleaf.cache=falseを設定すればキャッシュがoffになります)

Thymeleaf

については、ぽざうねさんがこれを教えてくれて

intellij idea - How do I enable Thymeleaf Live Reloading in Spring Boot 1.3 - Stack Overflow

bootRun {
    addResources = true
}

これを入れたら変更が即時反映された。(∩´∀`)∩ワーイ

しおしおさん、えいりゅーさん、ぽざうねさんありがとー!