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.rabitarochan
、 springboot-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
マクロを作成する
勝手に名前つけましたが、以下の手順で上で書いたマクロを作成していきます。
- IntelliJ IDEA を起動します
- メニューの [Edit] → [Macros] → [Start Macro Recording] をクリックします。(これ以降の操作がマクロの内容となります。)
- 【操作1】メニューの [File] → [Save All] をクリックします。
- 【操作2】メニューの [Build] → [Make Project] をクリックします。
- メニューの [Edit] → [Macros] → [Stop Macro Recording] をクリックし、マクロの記録を停止します。
- マクロ名を入力するダイアログが表示されるので、適当に名前を入力します。(ここでは
Save all and make
と入力します。)
3.2. マクロを実行するショートカットを設定する
マクロを Ctrl (or Cmd) + Shift + S
で実行できるようにするため、以下の手順でショートカットを登録します。
- メニューの [IntelliJ IDEA] → [Preferences...] をクリックします。(これは OS X の場合です。Windows は [File] → [Preferences...] だったはず・・・)
- 設定一覧の [Keymap] を選択します。
- 右側に検索ボックスが表示されているので、[save all] で検索すると、先ほど作成したマクロが表示されるので、[右クリック] → [Add Keyboard Shortcut] をクリックします。
- ダイアログが表示されるので、設定するショートカットを入力します。ショートカットの内容を確認して [OK] ボタンをクリックします。
これで IntelliJ IDEA の設定は完了です。
4. IntelliJ IDEA のプロジェクトを作成する
gradle のコマンドで IntelliJ IDEA のプロジェクトファイルを作成します。
ターミナルを起動して ./gradlew idea
を実行するだけです。Windows の場合は gradlew idea
です。
あとは、IntelliJ IDEA からプロジェクトのディレクトリを指定して Open します。
5. 実行する
まだ Kotlin は書いてませんが、実行方法を書いておきます。
Application
クラスを [右クリック] → [Debug ...] をクリックします。- あとはソース、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 で実装したソースもありますので、記事を書くまではこちらをご参照ください。
でわ。