【IntelliJ IDEA + Sparkアプリ + Kotlin: 設定と対峙したエラー】


【実装の目的】

IntelliJ IDEA(以下エディタ)を起動し、Spark framework(以下Spark)アプリケーションを開発するためにプロジェクトを作成。

【今回使用したOS及びツールのバージョン】

OS: mac OS X Yosemite 10.10.5
エディタ: IntelliJ IDEA COMMUNITY 2018.2
JDK: 10.0.2
Kotlin: 1.2.60

【工程(1): プロジェクト作成〜build.gradle設定】

(1) エディタでプロジェクトを作成。


(2) build.gradleを開いてから数秒間待つ。
(3) エディタ上部に「Ok, apply suggestion!」が表示される。
(4) クリックすることで、この提案を受け入れる必要がある。

提案を受け入れる前に、build.gradleにSparkを使用する設定を記述しておくこと。
提案受け入れ後に記述しても良いが、その場合はbuild.gradleの更新が必要。
Spark使用設定をスキップしてしまうと、.ktファイル内のimport時に参照されないので注意。

build.gradleの内容。

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.51'
}

version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "com.sparkjava:spark-core:2.6.0"
    compile "org.slf4j:slf4j-api:1.7.9"
    compile "org.slf4j:slf4j-log4j12:1.7.9"
}

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

【工程(2): Kotlinソースファイル作成〜Run実行】

(1) ./src/main/kotlin/main.ktを作成する。
(2)「Hello, world!」表示確認用に、以下のソースコードを記述する。

import spark.Spark.get

fun main(args: Array<String>) {
    get("/hello") { request, response ->
        "Hello, world!"
    }
}

(4) エディタのメニュー > Run > Run... > MainKtを選択。
(5) Run実行後、次のURLにアクセス出来ればビルド成功。


【Run実行時のエラー(1)】

java.lang.ClassNotFoundException

【対処法】

エディタが参照しているJDKのパスが正しく設定されているかどうか確認する。
整合性を合わせることで、「java.lang.ClassNotFoundException」は解消された。

【Run実行時のエラー(2)】

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.

【Failed to load classエラーの考察】

Java開発環境においてログ出力に必要なSLF4Jが見当たらないため、エラーが返されている。
エラーメッセージにあるURLを参照してみる。
https://www.slf4j.org/codes.html#StaticLoggerBinder

Failed to load class org.slf4j.impl.StaticLoggerBinder
This warning message is reported when the org.slf4j.impl.StaticLoggerBinder class could not be loaded into memory. This happens when no appropriate SLF4J binding could be found on the class path. Placing one (and only one) of slf4j-nop.jarslf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem.

要約すると、org.slf4j.impl.StaticLoggerBinderクラスが読み込まれていないので、slf4j-nop.jar、slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar、logback-classic.jarのいずれかのパスを、エディタに教えてあげなければならないようだ。

【対処法】

build.gradleに依存関係を追加する。

変更前

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "com.sparkjava:spark-core:2.6.0"
}

変更後

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "com.sparkjava:spark-core:2.6.0"
    compile "org.slf4j:slf4j-api:1.7.9"
    compile "org.slf4j:slf4j-log4j12:1.7.9"
}

build.gradle変更後は、エディタの右下に表示される「Import Changes」をクリックすることで、欠落していたjarをimportすることが出来る。