Closed13

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

Watanabe JinWatanabe Jin

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

Watanabe JinWatanabe Jin

Dockerfileを作ってktolinイメージで起動した
ktファイルの実行にjavaにビルドしてからそのファイルを実行しなくてはならない

 $ kotlinc src/hello.kt -include-runtime -d jar/hello.jar
 $ java -jar jar/hello.jar 

https://www.nooozui.com/entry/20191127/1574850600

gradle使うとこのステップが不要になる??
https://takaya030.hatenablog.com/entry/2018/09/02/140945

それとktolinの拡張をいれるとVSCodeでエラーになる
おそらくローカル(Ubuntu20.04)にktolin環境がないからエラーになってる

てことは、Goと同じく開発はリモートでコンテナに入ってやるべきなのか??

Watanabe JinWatanabe Jin

sparkの環境を作成する

まずgradleがbuildに必要なのでkotlinのイメージに追加でインストールした

FROM zenika/alpine-kotlin
RUN apk add gradle

そしてポートを開放

docker-compose.yml
version: '3'
services:
  app:
    build: .
    container_name: kotlin
    working_dir: /app
    volumes:
      - ./:/app
    ports:
      - "4567:4567"
Watanabe JinWatanabe Jin

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に変更した

Watanabe JinWatanabe Jin

ディレクトリは

└── src
    ├── main
    │   ├── kotlin

のようにしないとgradleがファイルを見つけられないようなのでディレクトリ構成を変更

https://qiita.com/masakielastic/items/8bbe515e8f695c96357e

をみならってbuild.gradlemainClassNamedemo.Helloktにしたので

.
└── src
    ├── main
    │   ├── kotlin
    │   │   ├── demo
    │   │   │    ├── Hello.kt

という構成で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にアクセスして表示された

Watanabe JinWatanabe Jin

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

Watanabe JinWatanabe Jin

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

Watanabe JinWatanabe Jin

Dockerfileを以下に変えてみたが、これだとデフォルトのgradleが動いちゃうから変更反映にいちいちコンテナ落とさないといけない微妙

Dockerfile
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 \
	"
Watanabe JinWatanabe Jin

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

Watanabe JinWatanabe Jin

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

interijでコンテナ使わないがよさそう

このスクラップは2022/12/12にクローズされました