🫖

Kotlin のプロジェクトに version catalog を導入する

2024/05/05に公開

概要

本記事では、Kotlin のプロジェクトに version catalog を導入する方法を記載します。

https://docs.gradle.org/current/userguide/platforms.html

version catalog について

version catalog は gradle の機能の 1 つです。
build.gradle.kts に記載する package やバージョンを ./gradle/libs.versions.toml に記載し、参照するようにします。
導入することで以下のメリットがあります。

  • IDE サポートが受けられる
  • マルチモジュールプロジェクトで複数の build.gradle.kts を記載するときに管理する箇所が 1 つになる
  • 複数の package のバージョンを同期させる必要がある(ex: kotlin と spring plugin、dekete の plugin と dependencies)場合でも一元化できる

本記事では、1 つめと 3 つめのメリットを後述する導入手順で確認します。

具体的な導入手順や、紹介します。

version catalog を導入

準備

Kotlin のプロジェクトのため、Intellij IDEA を利用します。
下記のコードを拡張機能をインストールしてください。

  • Kotlin
  • Gradle Version Catalogs

プレーンな Kotlin のプロジェクトに導入する

まずは、導入のため、簡単な Kotlin のプロジェクトに対して、Kotlin のバージョンを version catalog に移行します。
本項で作成したリポジトリのリンクは以下です。

https://github.com/Msksgm/sample-of-version-catalog

以下の画像のように、Intellij IDEA で新規プロジェクトを作成してください。

new-project-of-version-catalog
Kotiln プロジェクトを新規作成

続いて、./gradle/libs.versions.toml を作成します。
別の名前を利用する場合は、settings.gradle.kts に設定を書き加える必要がありますが、デフォルトではこの名前で呼び出されます。
作成したファイルに以下のように記述してください。
以下の設定では Kotlin のバージョンを指定しています。

./gradle/libs.versions.toml
[versions]
kotlin = "1.9.22"

[plugins]
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }

これを、build.gradle.kts において呼び出します。
plugins で指定している箇所を、下記のように書き換えてください。

build.gradle.kts
plugins {
    alias(libs.plugins.kotlin.jvm)
}

gradle が build する前は IDE 上ではコンパイルできないと指摘されます。
警告を無視して build して失敗した場合に対応するか、先に build.gradle.kts を書き換える前に gradle を読み込むことで build できるか確認できます。

build-error-of-version-catalog-build-gradle-kts
version catalog の指定でビルドエラーが検出されている

読み込みに成功すると、下記のように表示されます。
先述した拡張機能 Gradle Version Catalogs をインストールしておくと、利用しているバージョンが判明したり、コードジャンプで libs.versions.toml に飛べます。

new-project-of-version-catalog
version catalog の読み込みに成功

このようにして、version catalog の指定を toml ファイルに移行できました。

Spring Boot のプロジェクトに導入する

Spring Boot のプロジェクトに、version catalog を導入します。
本項で作成したリポジトリは以下です。

https://github.com/Msksgm/sample-of-spring-boot-version-catalog

まずは、以下のように Spring Initializr でプロジェクトを作成します。

spring-initializr-version-catalog
Spring Initializr

下記のリンクからも生成できます。

https://start.spring.io/#!type=gradle-project-kotlin&language=kotlin&platformVersion=3.2.5&packaging=jar&jvmVersion=17&groupId=com.example&artifactId=sample-of-spring-boot-version-catalog&name=sample-of-spring-boot-version-catalog&description=Demo project for Spring Boot Version Catalog&packageName=com.example.sample-of-spring-boot-version-catalog&dependencies=web

先述記述したように、./gradle/libs.versions.toml を作成します。
build.gradle.kts に記述した場合は、手動で kotlin-jvm と kotlin-plugin-spring の箇所を更新させる必要があります。
一方で、version catalog の場合は versons に記載した kotlin のバージョンを更新するだけで済みます。
このように version catalog によって、同期させるバージョンの管理が楽になります。

./gradle/libs.versions.toml
[versions]
kotlin = "1.9.22"
spring-boot-version = "3.2.5"
spring-boot-management = "1.1.4"

[libraries]
spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web" }
spring-boot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test" }
jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin" }
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect" }

[plugins]
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-plugin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot-version" }
spring-dependencymanager = { id = "io.spring.dependency-management", version.ref = "spring-boot-management" }

build.gradle.kts でこれらを参照するように記述します。

build.gradle.kts
plugins {
  alias(libs.plugins.spring.boot)
  alias(libs.plugins.spring.dependencymanager)
  alias(libs.plugins.kotlin.jvm)
  alias(libs.plugins.kotlin.plugin.spring)
}

dependencies {
  implementation(libs.spring.boot.starter.web)
  implementation(libs.jackson.module.kotlin)
  implementation(libs.kotlin.reflect)
  testImplementation(libs.spring.boot.starter.test)
}

gradle を読み込んで、build が通ったら完了です。

Discussion