SpringBoot + Kotlin + Devtools を IntelliJ IDEA で上手く動かす

Kotlin で Web 開発をするために、とりあえず今は Spring Boot を使っています。

Eclipse の HTML, JavaScript エディタが自分に合わない(合うプラグインを見つけられなかった)ため、IntelliJ IDEA を使おうと思って設定を始めたのですが、上手く動かす方法を見つけるのが大変だったのでここでまとめておこうと思います。備忘録。

1. プロジェクト作成

Spring Boot のプロジェクトについては、Spring Initializr を使って作ります。

今回は以下の内容で作ります。

  • Gradle project
  • Spring Boot Version 1.3.1
  • Dependencies:
    • Web
    • Devtools
    • Thymeleaf

Group と Artifact はご自由に。今回は com.rabitarochanspringboot-kotlin-intellij で作ってみます。

プロジェクトファイル一式を ZIP ファイルでダウンロードしたら、任意のディレクトリに展開します。

2. build.gradle 修正

次に、build.gradle に Kotlin 用の設定を追加していきます。

先に、変更箇所をコメントで記載した build.gradle 全体を載せます。

buildscript {
    ext {
        springBootVersion = '1.3.1.RELEASE'
        // (1) Kotlin のバージョンを指定
        kotlinVersion = '1.0.0-beta-4584'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        // (2) Kotlin の Gradle plugin を追加
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
    }
}

apply plugin: 'java'
// (3) Kotlin plugin を有効化
apply plugin: 'kotlin'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot' 

jar {
    baseName = 'springboot-kotlin-intellij'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    // (4) Kotlin のライブラリを参照追加
    compile("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
    compile('org.springframework.boot:spring-boot-devtools')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test') 
}

// (5) IntelliJ IDEA 用の設定を追加
idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.9'
}

(1) で、Kotlin のバージョンをプロパティとして定義します。Kotlin は現時点 (2016/1/12) でバージョン 1.0 のベータ版という状態のため、新しいバージョンが頻繁に出ます。今回の build.gradle でも 2 箇所で Kotlin のバージョンが必要となりますので、プロパティにしておいたほうがいいでしょう。

Kotlin のバージョンは、Kotlin の Twitter アカウントUsing Gradle で確認しています。

(2)、(3) で、Kotlin の Gradle プラグインを有効化しています。

(4) で、Kotlin の標準ライブラリを依存ライブラリに追加します。

(5) では、IntelliJ IDEA で make した際の出力ディレクトリを上書きしています。これは、Spring Boot Devtools の自動再起動を有効化するために必要です。

IntelliJ IDEA では make した際のデフォルト出力先は out ディレクトリとなっていますが、Spring Boot Devtools はこのディレクトリではなく、idea.module.outputDirs で指定した $buildDir/classes/main/ を見ているようです。IntelliJ IDEA プラグインの設定については IdeaModule - Gradle DSL Version 2.10 をご参照ください。

3. IntelliJ IDEA のショートカット登録

Spring Boot + IntelliJ IDEA で調べるとすぐ発覚するのですが、IntelliJ IDEA で実行 / デバッグ実行中に自動 make が起動しないという仕様があります。これに対応するために、Ctrl (or Cmd) + Shift + S でファイル保存と make をするマクロを実行するように設定していきます。

3.1. Save all and make マクロを作成する

勝手に名前つけましたが、以下の手順で上で書いたマクロを作成していきます。

  1. IntelliJ IDEA を起動します
  2. メニューの [Edit] → [Macros] → [Start Macro Recording] をクリックします。(これ以降の操作がマクロの内容となります。)
  3. 【操作1】メニューの [File] → [Save All] をクリックします。
  4. 【操作2】メニューの [Build] → [Make Project] をクリックします。
  5. メニューの [Edit] → [Macros] → [Stop Macro Recording] をクリックし、マクロの記録を停止します。
  6. マクロ名を入力するダイアログが表示されるので、適当に名前を入力します。(ここでは Save all and make と入力します。)

3.2. マクロを実行するショートカットを設定する

マクロを Ctrl (or Cmd) + Shift + S で実行できるようにするため、以下の手順でショートカットを登録します。

  1. メニューの [IntelliJ IDEA] → [Preferences...] をクリックします。(これは OS X の場合です。Windows は [File] → [Preferences...] だったはず・・・)
  2. 設定一覧の [Keymap] を選択します。
  3. 右側に検索ボックスが表示されているので、[save all] で検索すると、先ほど作成したマクロが表示されるので、[右クリック] → [Add Keyboard Shortcut] をクリックします。
  4. ダイアログが表示されるので、設定するショートカットを入力します。ショートカットの内容を確認して [OK] ボタンをクリックします。

これで IntelliJ IDEA の設定は完了です。

4. IntelliJ IDEA のプロジェクトを作成する

gradle のコマンドで IntelliJ IDEA のプロジェクトファイルを作成します。

ターミナルを起動して ./gradlew idea を実行するだけです。Windows の場合は gradlew idea です。

あとは、IntelliJ IDEA からプロジェクトのディレクトリを指定して Open します。

5. 実行する

まだ Kotlin は書いてませんが、実行方法を書いておきます。

  1. Applicationクラスを [右クリック] → [Debug ...] をクリックします。
  2. あとはソース、HTML ファイル等を編集して、上で登録したショートカットを押すと、デバッグ実行中でも自動再起動やホットスワップがおこなわれ、スムーズに開発できます!

また、コントローラーにルーティングを追加した場合や、クラスのメソッドを追加した際には、ホットスワップが上手く動かないらしく以下のメッセージが表示されます。

Hot Swap failed:
com.rabitarochan.MyApplication: add method not implemented;
com.rabitarochan.MyApplication: Operation not supported by VM

メッセージ的には failed と書いてありますが、Devtools の自動再起動にてちゃんと認識してくれるようですので、あまり気にしなくてもいいでしょう。ちゃんと認識しない場合はちゃんと再起動してあげたほうがいいです。

まとめ

あまり大きなアプリを開発しているわけではありませんが、以上の手順で今のところスムーズに開発できてます。

Kotlin で Spring Boot を書くためには少し工夫が必要だったりするので、それについてはまた後で記事を書こうと思います。まずは開発環境を構築するということで、ご査収ください。

今回のソースは以下のリポジトリです。Application クラスと Controller を Kotlin で実装したソースもありますので、記事を書くまではこちらをご参照ください。

github.com

でわ。