🐣

VSCodeでSpringBoot+Kotlinの環境を整えてみる

2024/06/01に公開

はじめに

VSCode で SpringBoot + Kotlin の開発が可能なのか調べるために簡単なログイン機能と WebAPI を実装し確かめてみた結果をまとめます。
結論としてはゴリゴリ開発するのは難しいと思いました。

確かめるために作ったプロジェクト
https://github.com/openriceworks/spring-kotlin-demo

ちなみに... IntelliJ を使わない理由

Kotlin を書く際に一番いいツールは間違いなく IntelliJ だと思います。開発元が同じですし。
IntelliJ の無料版では Kotlin/Java はサポートされているのですが、他の言語がサポートされていません。
フロントエンド(Vuejs/React + TypeScript)とサーバーサイド(SpringBoot + Kotlin)を同時に記述していく開発スタイルを取りたいので、どちらもそこそこにかける VSCode を使いたいのです。
有料版の IntelliJ を買えば全て解決ですね

拡張機能について

VSCode で Spring Boot + Kotlin を書くに当たって、以下の拡張機能をインストールしています。
有効に使えなかったものも含まれています。

fwcd.kotlin

https://marketplace.visualstudio.com/items?itemName=fwcd.kotlin

VSCode 用の Kotlin の拡張機能です。
下記のツールを利用して、VSCode 上でシンタックスハイライトやデバッグ実行をできるようにしてくれます。

詳しい検証結果は後述。

vmware.vscode-boot-dev-pack

https://marketplace.visualstudio.com/items?itemName=vmware.vscode-boot-dev-pack

Spring Boot の Java 用の拡張機能のセットです。

何らかの機能は使えるかと思いましたが、何も動かなかったです。

vscjava.vscode-gradle

https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle

Gradle 用の拡張機能です。
Activity Bar (VSCode の左端のアイコンが並んでいるところ)から、Gradle のタスクを実行できるようにしてくれます。
今回はbuild.gradle.ktsのように Kotlin で設定を記述しましたが、問題なく認識してくれました。
拡張機能経由のbootJarで作成した jar も実行することができました。

vscjava.vscode-java-pack

https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack

Java 用の拡張機能です。
Kotlin と Java の連携も確かめたかったのですが、VSCode + Kotlin の時点で思ったより上手くいかず調査を断念 ...

検証ポイント

デバッグ実行できる

fwcd.kotlinの機能でできます。

VSCode の実行機能と連携してくれますが、ビルドはしてくれないので実行前にgradle buildする必要があります。
実行前にビルドするように workspace ファイルに設定を加えることで特に意識しなくてもいいようにしました。

workspace の設定について

サンプルプロジェクトの workspace 設定から抜粋

ビルドタスクを追加
  "tasks": {
    "version": "2.0.0",
    "tasks": [
        {
          "label": "build",
          "type": "shell",
          "command": "./gradlew build -x test",
          "problemMatcher": [],
          "group": {
              "kind": "build",
              "isDefault": true
          },
          "presentation": {
            "close": true
          }
      },
    ]
  }
アプリの実行前にビルドタスクを実行するように設定
 "launch": {
    "version": "0.2.0",
    "configurations": [
      {
        "type": "kotlin",
        "request": "launch",
        "name": "Launch",
        "projectRoot": "${workspaceFolder}",
        "mainClass": "com/example/demo/DemoApplicationKt",
        "preLaunchTask": "build" // ここ!
      }
    ],
    "compounds": []
  },

また、ファイル名と一致しているクラスでないとブレークポイントをセットしてもプログラムを止めることができませんでした。
(最初はそういうものなのかと思ったのですが、IntelliJ ではファイル名とクラス名が一致していなくてもプログラムが止まったので拡張機能のバグでしょうか)

以下、余談。
Kotlin は初心者なのですが、ファイル名とクラス名を一致させるべきものなのでしょうか?
IntelliJ でもファイル名とクラス名が一致している時にはファイル名から拡張子の kt が省略される機能がありましたし。

フォーマットできる

できます。

fwcd.kotlinの機能の一つです。
フォーマッターにはktfmtを使用しています。

コード補完される

fwcd.kotlinの機能でコード補完されますが、不安定さがありました。
ライブラリのクラスはコード補完時に import 文も書いてくれましたが、自前で作ったクラスはコード補完されない時がありました。

ホットリロードされる

可能です。
VSCode の拡張機能ではなく、spring-boot-devtoolsライブラリにて、コードのビルド後にアプリケーションを再起動してくれます。
一つ注意が必要なのはあくまでビルド後なので、自らビルド(gradle なら gradle build)し class ファイルを更新しないとホットリロードされません。
(当たり前の話といえばそうなのですが、VSCode + Spring Boot + Java 環境ではコード保存後に自動ビルドしてくれるようになっていて Kotlin 環境では自前でビルドしないといけないのに気付けず苦戦しました)

テストメソッドが実行できる

できるといえばできるのですが期待通りというほどではなかったです。

もちろん、Gradle にてテストメソッドを実行することはできます。
どうせならTest Runner for Javaのように VSCode のTesting APIと連携し、テストメソッドを GUI から実行させたいところです。
これは Kotlin にて同等の機能を有する拡張機能がないのでできませんでした。

まとめ

「はじめに」にも少し書きましたが、LSP・デバッガが VSCode で使えるのでコーディングはできますが開発者体験がいいとはいえない印象でした。
もう少し拡張機能が強化されて痒い所に手が届くようになれば十分開発できるのかなと思います。

Discussion