endokのブログ

IT・プログラミングネタ

SpringBootの開発に自動リロード(ホットデプロイ)を導入する

はじめに

SpringBootの開発の流れは、

1. コードを書く
2. [Run As]→[Spring Boot App]で起動
3. 動作確認する
4. コードを書く
5. Consoleから起動中のアプリをTerminate
6. [Run As]→[Spring Boot App]で起動
7. 3に戻る

としていたが、

いちいち修正を反映するのに停止して起動するのは煩わしい。
1つ処理を書くたびに動作確認したいタイプなので、開発効率が悪くなってしまう。

S2Containerにはホットデプロイあって楽だったなぁ・・・と思ったので同様の仕組みを調べてみた。

Springという名前が付いているし、JRebelは商用(myJRebelというフリー版もあるようだが)なので、SpringLoadedとSpringBootDevToolsを試してみる。

SpringLoaded

特徴

特徴としては、

とのこと。

導入方法

jarをダウンロードし、
JVMの実行時の引数でそのファイルを指定するだけ。

https://github.com/spring-projects/spring-loaded
のInstallationに最新JARへのリンクが貼ってあるのでダウンロードして適当な場所に配置する。

STSを使っている場合、
[Run]→[Run Configurations..]を開き、
左のメニューから"Spring Boot App"を選択する。
右側のArgumentsタブのVM argumentsに下記を指定する。

-javaagent:[SpringLoadedのJARファイルへのパス] -noverify

例えばSampleWebProjectというプロジェクトフォルダ配下のtool\springloaded-1.2.5.RELEASE.jarに配置した場合、下記のようになる。

  • javaagent:${workspace_loc:SampleWebProject}\tool\springloaded-1.2.5.RELEASE.jar -noverify

この設定を行ったうえで起動すると、
ソースコードを保存するたびに変更が読み込まれ、反映されるようになる。
コンソールに特に何も出ないのでわかりづらいが、1,2秒後には反映されていた。

クラス追加には対応していないかと思っていたが、
新規クラスを追加してコントローラでそのインスタンスを使う処理を足してみても問題なく動作した。

Spring Boot Dev Tools

特徴

特徴としては、

  • SpringBootの開発補助ツール
  • クラスパスのリソースを監視し、変更があった時に自動リスタートする。(JVM実行中にクラスをリロードする機能ではない)
  • リスタートではあるが、ライブラリ類など変更が入らない"base"クラスローダと開発中の"restart"クラスローダの2つを使い、"restart"のみリスタートするため毎回すべて読み込み直すわけではない
  • 自動リスタート機能以外にも、デフォルトプロパティ、ライブリロード、リモートアプリケーション対応の機能を持つ
  • java -jarで起動された場合などは"本番"扱いとして無効になる

とのこと。

導入方法

pom.xmlに下記を追記するだけで導入できる。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

有効になると、いつもはコンソールに

[ main]

と出ていたものが、

[ restartedMain]

に変わる。

また、ソースコードを保存するたびにコンソールにSpringBootが起動しなおしている様子が出るのでわかりやすい。
再起動は2,3秒で終わり、思っていたよりも快適。

まとめ

どちらも速度的には実用レベルだったが、せっかくSpringBootで開発するのでSpringBootDevToolsを利用しようと思う。
DevToolsの方が後発で、リスタートの方が何をやっているかわかりやすくて安心ということもある。
ライブリロードなどは便利なのかわからないがひとまず有効にして様子を見てみるつもり。