Ktor + GradleでのAutoreload


先日、「Androidエンジニアが慣れている技術で作る維持費0円のサーバサイドアプリケーション」という記事でKtorとGradleを解説しました。この記事はその補足として、Autoreloadを解説します。

解決したい問題

./gradlew run コマンドでローカルサーバーを立ち上げることが出来ます。しかし、ソースコードの変更を行った後、その内容をローカルサーバーに反映するときは CTRL + C キーで終了してから、再度 ./gradlew run コマンドを入力する必要があります。この手間を省力化したいです。

前提条件

先日の記事「Androidエンジニアが慣れている技術で作る維持費0円のサーバサイドアプリケーション」のGoogle App Engineにデプロイする以外の設定は完了している状態を前提に説明します。

動作確認

Ktorの1.4.0および1.4.3で動作確認しています。1.5.0では動作しませんでした。

KtorのAutoreloadを使う

Ktorの標準機能としてAutoreloadがあります。 公式解説

まず application.conf ファイルに監視フォルダフルパスの一部分を設定します。
Kotlinソースコードは src/main/java 以下に置いたので、 main を一部分として指定しました。
その一部分を含む.classファイルの更新がローカルサーバに反映されます。

src/main/resources/application.conf
ktor {
    deployment {
        port = 8080
        // 追加
        watch = [ main ]
    }
    // 略
}

.classファイルの更新が反映されるので、ビルドは必要です。
InteliJ IDEAの Build Project ボタンを押すか

ローカルサーバが動作しているコンソールとは別のコンソールで

./gradlew installDist

コマンドを入力します。
ブラウザをリロードすると変更が反映されます。

ソースコードの変更をトリガーにビルドを実行する

さらにGradleのContinuous Buildを使うことでソースコードの変更をトリガーにビルドを実行できるため、 Build Project ボタンクリックや ./gradlew installDist コマンド入力の手間を省くことができます。

ローカルサーバが動作しているコンソールとは別のコンソールで

./gradlew installDist --continuous

または

./gradlew installDist -t

を実行します。