Home About Contact
Kotlin Ktor , Gradle

最小限の Ktor アプリを用意その2

ApplicationConfig を使って Production と Debug 環境で設定を切り替える。

前回からの変更点 Application.kt:

@@ -5,6 +5,7 @@
 import io.ktor.server.application.install
 import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
 import io.ktor.http.ContentType
+import io.ktor.server.config.ApplicationConfigValue
 import io.ktor.server.request.receive
 import io.ktor.server.response.respond
 import io.ktor.server.routing.Routing
@@ -18,6 +19,9 @@
 data class Pokemon(val id: Int, val name: String)

 fun Application.main() {
+    val appConfig: ApplicationConfigValue? = environment.config.propertyOrNull("app.debug")
+    println("debug = ${appConfig?.getString()?.toBoolean()?:false}")
+
     val defaultPokemon = Pokemon(0, "Pikachu")

     val pokemonStorage = mutableListOf<Pokemon>()

切り替えるといってもここでは app.debug が false か true か どちらの設定になっているかを標準出力するだけ。

そして ./app/src/main/resources/debug.conf を用意:

ktor {
    deployment {
        port = 8080
    }

    application {
        modules = [ org.example.ApplicationKt.main ]
    }
}

app {
    debug = true
}

./app/src/main/resources/application.conf をコピーして app ブロックを書き足しただけです。

まず、普通に実行して debug = false と標準出力することを確かめます。

$ ./gradlew buildFatJar
$ java -jar app/build/libs/fat.jar
debug = false

false になりました。 何も指定しなければ、./app/src/main/resources/application.conf が使用されるらしいです(要確認)。

それでは、debug.conf を指して実行します。

$ java -jar app/build/libs/fat.jar -config=app/src/main/resources/debug.conf
debug = true

true になりました。

fatJar をつくらないで、 ./gradlew run で確認することもできます。 その場合注意すべきは debug.conf へ至る相対パスの指定方法です。 今はアプリのビルドファイルが ./app/build.gradle.kt に配置されているので、 ./app を基準にして、そこから相対パスで指定する。

つまり、次のようになります。

$ ./gradlew run --args="-config=src/main/resources/debug.conf"

なお、もし debug.conf ファイルをプロジェクトルートに配置した場合は:

$ cp ./app/src/main/resources/debug.conf debug.conf
$ ./gradlew run --args="-config=debug.conf"

のように指定します。

このときは ./app からの相対パスで指定するわけではない! 面倒くさい。

最後に現状のディレクトリ構成を確認:

.
├── app
│   ├── build.gradle.kts
│   └── src
│       └── main
│           ├── kotlin
│           │   └── Application.kt
│           └── resources
│               ├── application.conf
│               └── debug.conf
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
└── settings.gradle.kts

以上です。