これまではずっとEclipse(STS) + Mavenでわいわいコード書いて過ごしてきたんだけど、最近IntelliJ IDEA使い始めたうえに、MavenじゃなくてGradle使い始めて、頭で考えたことがそのまま手に繋がらなくてぐぬぬってなりながらコード書いてる。まぁ、それ自体は楽しんでる。
んで、どうやったらいいんだろう?って思ったのが
変更が反映されない
ってこと。次の2つ。アプリを起動(bootRun)してる状態で
- コードを変更してもDevToolsがリロードしてくれない
- Thymeleafのテンプレートの変更が反映されない
結論から言うと
どちらも解決しました。で、コードの変更の方はDevToolsだけじゃなくて、SpringLoadedというものもあるって教えていただいたんですけど、最終的にはDevToolsにすることにしました。
つぶやき
STSのときはどっちも大丈夫だったんだけど、IntelliJだとそういうもんなのかなぁ?いやー、そんなことないよなぁ?と思いつつ、つぶやき。
IntelliJでGradleでSpring BootでThymeleafのテンプレート触るときって、毎回bootRunしないといけないのかな?Eclipseだったらそのまま触れてたんだけど、そゆのはないのかな?
— Mitsuyuki Shiiba (@bufferings) 2017年7月21日
そしたらしおしおさんが「昔のやつなので、今できるかは分からないですが」ってコメントつきでSpringLoadedを教えてくれました。(∩´∀`)∩ワーイありがとうございます!SpringLoadedって全然知らなかったんだけど、アプリを再起動せずにHotReloadしてくれるみたいで便利そうだなー。
んで、DevToolsとかSpringLoadedとかをごにょごにょしながら「んむーうごかんー」とかしばらく戦ったのですが。
DevToolsとかSpringLoadedとかを使うときには
どちらのツールも、この2つの設定をすれば動きました。変更したときに自動でビルドする設定。
まずは "Build project automatically"
んで、もういっこ。上記のままだと、IDEAからbootRunでアプリを起動してるときにはビルドが走らないのでそれを有効にしてあげた。
参考: Intellij IDEA – Spring boot template reload is not working
Help > Find Action... から、"Registry" って打って出てきたやつで "compiler.automake.allow.when.app.running" にチェック
あとは、それぞれのツールの説明を見ながら動かせば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 }
これを入れたら変更が即時反映された。(∩´∀`)∩ワーイ
しおしおさん、えいりゅーさん、ぽざうねさんありがとー!