概要
Kotlin 製の Web アプリケーションフレームワーク HTTP4K を使った最小のアプリケーション開発について説明します。
HTTP4K とは?
サーバーサイドのアプリケーションを開発するための Kotlin 製フレームワークです。
Kotlin Conf 2018 のセッション資料だとサーバーレス環境向けのフレームワークという触れ込みですが、単にマイクロWebアプリケーションを開発するのにも使えます。
README を見ると、テストもしやすい設計になっているようです。
なぜ HTTP4K か?
Kotlin は Java のアプリケーションフレームワークを(ほぼ)そのまま使うことができるため、すでに実績のあるフレームワークを用いるという選択肢もあります。
ただ、その方法だと Java の記法上の制約や NonNull/Nullable の穴による意図しない不具合に注意する必要があり、Kotlin を使うメリットが減少しかねません。
フル Kotlin で開発されたアプリケーションフレームワークを使うことで、その問題は解消されます。
また、フル Kotlin のアプリケーションフレームワークはほかにもありますが、 HTTP4K は純粋にアプリケーション開発にフォーカスして開発されているので、
通常の Web アプリケーション開発のコンテクストで開発をすることができます。
一方で、プロトタイピング目的で小さい Web アプリケーションを Kotlin で開発するのであれば、Spark-Java & Spark-Kotlin という選択肢もあります。
そちらに比べると、HTTP4K は記述量がちょっと多くなると感じました。
使ってみる
Hello world
以下のコードで十分です。
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.routing.bind
import org.http4k.routing.routes
import org.http4k.server.SunHttp
import org.http4k.server.asServer
fun main(args: Array<String>) {
routes("/hello" bind Method.GET to { _: Request -> Response(OK).body("hello!!") })
.asServer(SunHttp(8000))
.start()
}
……これで十分ですが、 import が結構多いので手軽感はやや薄いかもしれないです。
Gradle Application Plugin と組み合わせて使う
Java 用の Gradle Application Plugin を使う場合、また IDE に Kotlin の main メソッドを認識させたい場合、object クラスの main メソッドに @JvmStatic アノテーションを付けるとよいらしいです。
object Main {
@JvmStatic
fun main(args: Array<String>) {
あとは build.gradle を修正します。具体的には main メソッドのある object クラスの FCDN を mainClassName で指定します。
apply plugin: 'application'
mainClassName = "jp.toastkid.http4k.example.Main"
//...
これで gradle run
を実行すればアプリケーションが起動するようになります。
Fat jar
Fat jar を作りたい場合は以下を追記してください。
jar {
manifest {
attributes 'Main-Class' : mainClassName
}
destinationDir = projectDir
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
これで $gradle jar
を実行すると Fat jar が出力されます。 出力された Fat jar を使い、 $ java -jar http4k.example-0.0.1.jar
を実行すれば、アプリケーションが起動します。