万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Kotlinのktorを使う

Getting Startedを見てみる。 Getting Started · Kotlin/ktor Wiki · GitHub

importがない・・・。

https://github.com/Kotlin/ktor

公式でさえ

embeddedServer(Netty, 8080) {
    routing {
        get("/") {
            call.respondText("Hello, world!", ContentType.Text.Html)
        }
    }
}.start(wait = true)

しかない。 一応これをsrc/main/kotlin/main.ktにでも記載する。

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

build.gradle

これの記載は

buildscript {
//    ext.kotlin_version = '1.0.3'
//    ext.ktor_version = '0.3'

    ext.kotlin_version = '1.1.3'
    ext.ktor_version = '0.3.2'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

repositories {
    mavenCentral()
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
    maven { url "https://dl.bintray.com/kotlin/ktor" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.ktor:ktor-core:$ktor_version"
    compile "org.jetbrains.ktor:ktor-locations:$ktor_version"
    //runtime "org.jetbrains.ktor:ktor-netty:$ktor_version"
    compile "org.jetbrains.ktor:ktor-netty:$ktor_version"
    // いらないかも?(https://mvnrepository.com/artifact/io.netty/netty-all/4.0.4.Final)をみた
    compile group: 'io.netty', name: 'netty-all', version: '4.0.4.Final'
}

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}
// いらないかも?
mainClassName = 'org.jetbrains.ktor.netty.DevelopmentHost'

インポートの記載

一旦ここを参考にした。 ohtomi.hatenablog.com

import org.jetbrains.ktor.netty.*
import org.jetbrains.ktor.netty.embeddedNettyServer // deprecatedなので不要
import org.jetbrains.ktor.routing.*
import org.jetbrains.ktor.application.*
import org.jetbrains.ktor.host.*

import org.jetbrains.ktor.http.* // embeddedServer
import org.jetbrains.ktor.response.*

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

org.jetbrains.ktor.netty.embeddedNettyServerをインポートするともうdeprecateで古いって言われる。 新しいembeddedServerを使うためimport org.jetbrains.ktor.http.*を使う。

この辺を見るとimportの参考になる ktor/EmbeddedApplication.kt at 8e14bfa6d032a5ab03fad724dde503d52e1aeccb · Kotlin/ktor · GitHub

他にもどのメソッドがどこにあるかわからないがこんな感じ? ↓

routing・・・import org.jetbrains.ktor.routing.*をする。 call・・・・import org.jetbrains.ktor.response.*をする。 Netty・・・・こいつが曲者import org.jetbrains.ktor.netty.*にある。

build.gradle

//    ext.kotlin_version = '1.0.3'
//    ext.ktor_version = '0.3'

コメントアウトしたのは1.0だとcall.respondTextが使えないとか言われるから。

build.gradle · master · Artur Bosch / TinboServer · GitLab

でも正しいバージョンとかわからないので↑を見て。

    ext.kotlin_version = '1.1.3'
    ext.ktor_version = '0.3.2' // 上だと1だけど2でも行けたからそっちにした

にした。

Error:(13, 13) Kotlin: 'get(String, suspend PipelineContext<ApplicationCall>.(ApplicationCall) -> Unit): Route' is only available since Kotlin 1.1 and cannot be used in Kotlin 1.0
Error:(13, 13) Kotlin: The feature "coroutines" is only available since language version 1.1 (see: https://kotlinlang.org/docs/diagnostics/experimental-coroutines)
Error:(14, 22) Kotlin: 'respondText(String, ContentType): Unit' is only available since Kotlin 1.1 and cannot be used in Kotlin 1.0

があああ・・とまだいろいろエラーでる。 build.gradleに書いたのは関係ない?

おそらくIDE自体の設定で、今回のプロジェクトに絞ったのではない設定だと思うが、 「command + ,」での設定(またはバーのIntelliJ IDEA→Prefarences…)。

f:id:shinriyo:20170521153123p:plain

ここを1.0から1.1にする。

しかしこれではだめだった。

今回のプロジェクト設定もする。 (個別設定があるので先程の手順はいらないかもれない)

f:id:shinriyo:20170521153653p:plain

プロジェクト名のあるフォルダを右クリックしてここを選ぶ。(ショートカットは「command + 」) さらにここで自分のtest/test_mainを選んで1.1にする。

「Use project settings」にチェックでもいいと思う。先程の手順はいらないかもれないって言ったけどこの時なら役立つね。

これでやっと動いたーーーーーー。 f:id:shinriyo:20170521154554p:plain