IntelliJ+Gradle+JDK9+Kotlin1.2+SpringBoot2でHello,World

IntelliJとJDKは入ってるところからスタート。

Spring InitializrでProjectを作成

https://start.spring.io/

Dependenciesとして、
Web,Thymeleaf,DevToolsを追加しました。

IntelliJでImport Project


いろいろチェックして、Gradle JVMで9.0を選択。

Could not determine java version from '9.0.1'.

というエラー。
対処法
https://qiita.com/Kaoru_Yamamoto/items/dcb3815795d6e752cff3
この時、Gradleが4.2なんですが、Java9に対応していないため発生するエラーとのこと。
Gradle4.2.1以降にすると大丈夫のようです。

現時点で4.4.1が最新なのでそれを使うことにします。

gradle->wrapper->gradle-wrapper.propertiesを編集。
4.2になっているところを4.4.1に変更して保存。
するとエラーが消え、依存性のインストールが勝手に始まります。

buildする

IntelliJメニューのView->Tool Windows->GradleでGradle Projectsを開く。
その中のTasks->build->buildを実行。

するとエラー。

:compileKotlin
w: Runtime JAR files in the classpath have the version 1.1, which is older than the API version 1.2. Consider using the runtime of version 1.2, or pass '-api-version 1.1' explicitly to restrict the available APIs to the runtime of version 1.1. You can also pass '-language-version 1.1' instead, which will restrict not only the APIs to the specified version, but also the language features. Alternatively, you can use '-Xskip-runtime-version-check' to suppress this warning
w: /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.1.61/bb6da1a122c3fba2f7ee5c71946441e4f756fad4/kotlin-reflect-1.1.61.jar: Runtime JAR file has version 1.1 which is older than required for API version 1.2
w: /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.61/59dfce93b1995717338435dd974884007d8e8474/kotlin-stdlib-jre7-1.1.61.jar: Runtime JAR file has version 1.1 which is older than required for API version 1.2
w: /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.61/7cb0d1b54614623a4b297af1eea7bc3aa0e9e63/kotlin-stdlib-jre8-1.1.61.jar: Runtime JAR file has version 1.1 which is older than required for API version 1.2
w: /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.61/fa7813a26c548c9c412dd2d42fb466cfcd8dcf3c/kotlin-stdlib-1.1.61.jar: Runtime JAR file has version 1.1 which is older than required for API version 1.2

kotlin-reflectとkotlin-stdlibというものが1.1対応のものを使っているのでエラーになっている。

Projectのbuild.gradleを編集する。

compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")

1.2のものを使うように変更。

buildすると先ほどとはちょっと違ったエラーが。。。

w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.2.0/505f55b9619bbc5f5e26c77427dd24a6a441eef1/kotlin-stdlib-jre8-1.2.0.jar (version 1.2)
    /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.0/4bbda3b5425aa38a9f6960468a29c5ef3e8a28c9/kotlin-reflect-1.2.0.jar (version 1.2)
    /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.61/59dfce93b1995717338435dd974884007d8e8474/kotlin-stdlib-jre7-1.1.61.jar (version 1.1)
    /Users/hide/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.61/fa7813a26c548c9c412dd2d42fb466cfcd8dcf3c/kotlin-stdlib-1.1.61.jar (version 1.1)
w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath or use '-Xskip-runtime-version-check' to suppress this warning

よくわからないので、一旦依存性を削除。

//compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
//compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")

その後また依存性を入れ直す。
そしたらエラー発生せずbuild成功しました。

bootRun


Gradle Projectsのapplication->bootRun

ブラウザでhttp://localhost:8080/にアクセスするとTomcatが起動してるのを確認できる。

コントローラー作成

src->main->kotlin->com.ohamoni.ohamoniにクラスを作成。
@RestControllerと@RequestMapping(“/”)を付ける。

package com.ohamoni.ohamoni

import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class TopController {

    @RequestMapping("/")
    fun index() = "おっはもーにん!"
}

するとブラウザに表示される。

Thymleafを使ったやつはまた今度。
あと、

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/Users/hide/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.0.2.RELEASE/45b2958ab3fb022dd29f8b1c553ebf1c75a144aa/spring-core-5.0.2.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

っていう警告出てるけど、このままでも実行できるのでそのうちの対処で。