Spring Boot + Gradle + Kotlin の開発環境を構築してみた(結構ハマった)

Spring Boot + Gradle + Kotlin でバックエンド側を作ってみようと思い、まずは環境を構築してみました。

結構ハマりました。

前提

STS (Spring Tool Suite) v3.9.0

Gradleのインストー

STS で Spring Starter Project を作ろうとして、Gradle (Buildship 2.x) を選ぶと、Eclipse Marketplace からインストールしてね、というメッセージが表示されます。

Gradle (STS) もありますが、あまりメンテされなくなるそうなので Buildship が推奨とのことです。

Help メニューから Eclipse Marketplace を開き、gradle で検索すると、「Buldship Gradle Integration 2.0」が見つかるので、インストールします。

その後、再度プロジェクトを作ろうとすると、一覧から Gradle (Buildship 2.x) が消えています。

まだバグっているのかもしれないですね。

仕方がないので、Gradle (STS) を選択すると、Dashboard からインストールしてね、というメッセージが出るので、Dashboard の「IDE EXTENTIONS」を開いて「Gradle (STS Legacy) Support」をインストールします。

これで、プロジェクト作成時に Gradle (STS) を選択できるようになります。

Kotlinの設定

プロジェクト作成時に Language 欄に Kotlin があるのでそれを選択します。

プロジェクトが生成されたら、右下の「Boot Dashboard」で実行してみます。

すると、以下のようなエラーが表示されます:

Couldn't find a main type in 'demo'

ここでかなり悩みましたが、プロジェクト作成時に Kotlin を選択するだけではダメで、Kotlin Plugin for Eclipse というプラグインをインストールしないといけないようです。

Eclipse Marketplace からこのプラグインをインストールします。

なお、このプラグインはまだアルファ版らしく、インストール時に署名がないというメッセージが出ますが、そのままインストールします。

その後、Kotlin のランタイムライブラリーを追加するために、プロジェクトを選択して右クリックメニューから Configure Kotlin > Add Kotlin Nature を実行します。

アプリの実行

Run As > Spring Boot App での実行はまだサポートされていないようです。

代わりに、main() 関数を含むソースファイルを右クリックして、Run As > Kotlin Application で実行できます。

ですが、以下のようなエラーが出ました:

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@77be656f: startup date [Mon Jul 24 17:58:31 JST 2017]; root of context hierarchy
.....

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'DemoApplication' may not be final. Remove the final modifier to continue.
.....

2つ目のエラーを見ると、クラスが final なのがダメなようです。

クラス定義の前に open を付けるとうまくいきました:

open class DemoApplication

追記(2017-07-25)

その後、STSではなく、IntelliJで新たにプロジェクトを作成してみたら、open は必要ありませんでした。

何か他の要因があるのかもしれません。

追記終了

なお、ブラウザーでアクセスすると、エラーページが表示されますが、これは Spring Boot アプリのデフォルトです。

表示するページを追加すれば解消します。

実行設定を追加

毎回ファイルを選択して実行するのは面倒なので、Spring Boot App の実行設定を追加します。

Run > Run Configurations

Spring Boot App のタイプを選択して新規追加しますが、Main type のところには、フルパスのクラス名に「Kt」を付けます:

com.example.demo.DemoApplicationKt

これは、Kotlin 用に内部で上記のクラスが生成され、そこに main() 関数が入るためです。

なお、入力欄横の Search 機能は使えないので、手で入力する必要があります。

これで、ツールバーから直接実行できるようになります。

あとがき

Android では Kotlin の環境が整ってきている印象ですが、サーバー側はまだまだですね。

特に、最初の段階からググらないといけないのは、困りますね。

プロジェクト作成時に Kotlin を選んだら、お知らせしてほしいところです。

参考情報

Spring Tool Suite and Kotlin