🕌

Kotlin+Spark+GradleでDocker環境構築

2022/12/10に公開

はじめに

今回はDockerを利用したKotlin, Spark環境を構築していきます
Kotlin を Java の知識なしにやることになったのですが、JVM の知識や環境構築を一切知らない状態だったのでネットを調べながらやろうとしたのですが、gradle であったり、IntellJ であったり、VSCode(Windows)で開発してきた私にはまったく理解できない記事がほとんどでかなり時間がかかってしまいました。

そこで現状動いた環境の構築手順をまとめます。

今回学習している本は以下になります

https://www.amazon.co.jp/Kotlin-Webアプリケーション-新しいサーバサイドプログラミング-長澤-太郎/dp/4865940669/ref=sr_1_14?__mk_ja_JP=カタカナ&crid=2GHV4UD57WTAW&keywords=kotlin&qid=1670657879&sprefix=kotlin%2Caps%2C704&sr=8-14

このハンズオンで Spark を用いたサーバーが起動するところまで確認ができます

環境

Windows 11
VSCode
Ubuntu 20.04 (WSL2)
Docker 20.10.12
docker-compose version v2.2.3
git version 2.25.1

環境構築

まずは Docker 周りのファイルを作成します

$ mkdir kotlin-spark-handson
$ cd kotlin-spark-handson
$ touch Dockerfile
$ touch docker-compose.yml

作成したファイルに以下を記載します

Dockerfile
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"

kotlin が起動できるか確認します

$ docker-compose build
$ docker-compose up

次にgradleのプロジェクトを作成します
別のターミナルを開いて以下を実行します

$ docker exec -it kotlin sh
$ gradle init

ファイルが色々作成されました

別ターミナルを開らいてファイルの権限を変更しておきます

$ sudo chown -R ユーザー名:ユーザー名 ./*

次にgradleコマンドで kotlin を実行するときの設定をbuild.gradleに書きます

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"
}

この設定ファイルは以下を参考にしました

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

またバージョンを新しいものにしないとエラーになったので1.3.72としました

https://breakcontinue.net/could-not-initialize-class-org-jetbrains-kotlin-gradle-plugin-sources-defaultkotlinsourcesetktのエラーの対象法/

次にサンプルの実行ファイルを用意します

$ mkdir -p ./src/main/kotlin/demo
$ touch ./src/main/kotlin/demo/Hello.kt

Hello.kt を以下にします

/src/main/kotlin/demo/Hello.kt
package demo
import spark.Spark.get

fun main(args: Array<String>) {
		get("/hello") { req, res -> "Hello World" }
}

実際に実行してみます

$ gradle
/app # gradle
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details

> Task :compileKotlin
w: /app/src/main/kotlin/demo/Hello.kt: (5, 19): Parameter 'req' is never used, could be renamed to _
w: /app/src/main/kotlin/demo/Hello.kt: (5, 24): Parameter 'res' is never used, could be renamed to _

> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE

> Task :run
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.

ブラウザを開いてlocalhost:4567/helloにアクセスします

以下の画面になれば成功です

おわりに

ここまでの内容はあくまで書籍のサーバー起動の箇所までを動かすために作成したものになるので今後不都合があるかもしれません。ご了承ください

なんとか時間はかかりましたがサーバー起動までいけたのでよかったです。別のフレームワークだとまたやり方が変わってきて時間がかかりそうです。

はやく環境構築から解放されて、Kotlin 自体の学習をしたいものです

今回作成したリポジトリは以下になります

https://github.com/jinwatanabe/kotlin-spark-docker

参考

GitHubで編集を提案

Discussion