kotlin+Sparkでハンズオンを行うまでの知見

Dockerの環境を作ろうとしたが、spring bootのプロジェクトをつくっていたり、Dockerfile作るだけでは環境構築ができなさそう。gradleというのを使っているがそれもよくわからないのでとりあえず飛ばす

Dockerfileを作ってktolinイメージで起動した
ktファイルの実行にjavaにビルドしてからそのファイルを実行しなくてはならない
$ kotlinc src/hello.kt -include-runtime -d jar/hello.jar
$ java -jar jar/hello.jar
gradle使うとこのステップが不要になる??
それとktolinの拡張をいれるとVSCodeでエラーになる
おそらくローカル(Ubuntu20.04)にktolin環境がないからエラーになってる
てことは、Goと同じく開発はリモートでコンテナに入ってやるべきなのか??

とりあえずこの本を進めていく
環境周りはよくわからないことが多いので、適宜必要になったら調べて追加してく

sparkの環境を作成する
まずgradleがbuildに必要なのでkotlinのイメージに追加でインストールした
FROM zenika/alpine-kotlin
RUN apk add gradle
そしてポートを開放
version: '3'
services:
app:
build: .
container_name: kotlin
working_dir: /app
volumes:
- ./:/app
ports:
- "4567:4567"

gradleにはプロジェクトというものが必要らしいのでコンテナの中で以下を実行
$ gradle init
ファイルが作成された
build.gradle
で実行するときの設定をするらしい
package.json的なイメージ
以下のように設定した
plugins {
id "org.jetbrains.kotlin.jvm" version "1.3.72"
}
apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'demo.HelloKt'
defaultTasks 'run'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
compile "com.sparkjava:spark-core:2.6.0"
}
書籍のバージョンでは古いので1.3.72
に変更した

ディレクトリは
└── src
├── main
│ ├── kotlin
のようにしないとgradleがファイルを見つけられないようなのでディレクトリ構成を変更
をみならってbuild.gradle
のmainClassName
をdemo.Hellokt
にしたので
.
└── src
├── main
│ ├── kotlin
│ │ ├── demo
│ │ │ ├── Hello.kt
という構成でHello.kt
を作成
package demo
import spark.Spark.get
fun main(args: Array<String>) {
get("/hello") { req, res -> "Hello World" }
}
以下のコマンドで実行
$ gradle
localhost:4567/hello
にアクセスして表示された

ここまでの内容は以下の記事にまとめた

なぜかdevContainerにはいれないのでVSCodeのkotlin拡張が利用できない
利用しているイメージの最後のCMD["kotlinc"]
が原因な気がする

なぜかdev containerがVSCodeではいれないので拡張機能が使えない
仕方ないのでローカルにJavaとkotlinをいれてみる

ローカルにインストールしたがどうしてもsparkのところの解決ができなくて拡張機能でエラーがでてしまう
VSCodeじゃなくてInteriJ使うべき?

Dockerfileを以下に変えてみたが、これだとデフォルトのgradleが動いちゃうから変更反映にいちいちコンテナ落とさないといけない微妙
FROM gradle:5.4-jdk-alpine
ENV APP_ROOT /usr/src/app
WORKDIR $APP_ROOT
USER root
RUN apk add --no-cache curl \
zip \
libc6-compat \
bash
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
RUN curl -s https://get.sdkman.io | bash
RUN bash -c " \
source "$HOME/.sdkman/bin/sdkman-init.sh" && \
sdk install kotlin 1.3.72 \
"

そもそもkotlinってVSCodeやDocker使うんじゃなくてInteriJ使うのがほとんどなのかもしれない
それなら記事があまりないのも納得できる
環境作ってみよう

とりあえずエラーがvscode上にでてるし、コンテナの中にremote containerで入らないけど最後までできたのでこれでクローズ
interijでコンテナ使わないがよさそう