あしたからがんばる

プログラミングの話と時々サッカーの話

触りは簡単なやつだけにするはずが謎の深みに嵌るよくある展開

自分用とはいえ、サービスを作るにあたって本当は要件とかから考えるべきなんだろうけど、そんなに頑張れないので適当にサーバサイドから作ることにする。 最近仕事で触ってる ktor を使う。まっさらの状態から組んだことはないので勉強になるだろうし。

Quick Start - Quick Start - Ktor

ビルドツールは gradle で良いので、↓をまるっとコピーしてから、最小構成を目指して設定を削ったりバージョンを上げたりしてみる。

Gradle - Quick Start - Ktor

削った結果がこちら。

buildscript {
    ext.kotlin_version = '1.3.60'
    ext.ktor_version = '1.2.5'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
}

以下の設定はコルーチンが experimental だった頃の名残っぽかったので削除した。 1.3になる前までは、↓のようにオプトインしないとコンパイル時に警告出てたらしいけど、現状では出なかったので問題ないと判断した。

kotlin {
    experimental {
        coroutines 'enable'
    }
}

簡素化した build.gradle を IntelliJ で読んで、src/main/kotlin にパッケージ掘って、BookmarkApp.kt というファイルを作成して、以下の内容にすると無事に起動できて、localhost:8080 にアクセスするとレスポンスも返ってきた。

package com.github.mwatanabe.bookmark

import io.ktor.application.call
import io.ktor.http.ContentType
import io.ktor.response.respondText
import io.ktor.routing.get
import io.ktor.routing.routing
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty


fun main(args: Array<String>) {
    embeddedServer(Netty, 8080) {
        routing {
            get("/") {
                call.respondText ("My Bookmark", ContentType.Text.Html)
            }
        }
    }.start(wait = true)
}

しかし、起動はするものの、以下の警告が発生した。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

gradle dependencies で見たところ、ktor server が slf4j-api に依存しているようだった。

まぁそれはそうだよね、という気がするので、logback-classic を dependency に追加した。logback-classic の classic とはなんぞやと思ったが、slf4j の API を実装しているやつらしいので、これを使えば良い。

http://logback.qos.ch/manual/architecture_ja.html

compile "ch.qos.logback:logback-classic:1.2.3"

その結果、Netty が謎のログを出すようになったが、何やらただのデバッグログしいので、気にしないことにする。

UnsatisfiedLinkError with Netty · Issue #1203 · ktorio/ktor · GitHub

0:09:31.787 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - netty_transport_native_kqueue cannot be loaded from java.library.path, now trying export to -Dio.netty.native.workdir: /var/...
java.lang.UnsatisfiedLinkError: no netty_transport_native_kqueue in java.library.path
...

触りはこのぐらいまでにしておこう。 今日は結構頑張ったから、明日は頑張らないようにしたい。