GradleのVersionCatalogを使用する

Version Catalogとは

Gralde 7.0~導入された、依存関係やプラグインを集約管理するための設定方法。
公式:Sharing dependency versions between projects

単一プロジェクトの場合、build.gradleも1ファイルで完結することが多いので、あまり良さが感じられないが、
マルチプロジェクトの場合、同じ依存関係を何回も書く必要がなくなるので、導入のメリットを感じやすい。

使用方法

以下のbuild.gradleを Version Catalogを使用したものに修正しながら、使用方法を説明する。

Gradle Wrapper Version :8.2.1

plugins {
  id 'java'
  id 'org.springframework.boot' version '2.7.15'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '1.0.0'

java {
  sourceCompatibility = '17'
}

repositories {
  mavenCentral()
}

dependencies {
  // Spring
  implementation 'org.springframework.boot:spring-boot-starter'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'

  // Apache Commons Lang3
  implementation 'org.apache.commons:commons-lang3:3.12.0'

  // JUnit
  testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
}

tasks.named('test') {
  useJUnitPlatform()
}

libs.versions.tomlファイルの作成

依存関係を一元管理するファイルを作成する。
ルートプロジェクトの「gradle」ディレクトリの直下に「libs.versions.toml」を作成する。

定義の追加

作成した「libs.versions.toml」に以下の定義を追加する。

[versions]

[libraries]

[plugins]

versions
バージョンNoを変数に入れて管理する際に記述する。

libraries
依存関係を管理する際に記述する。

plugins
プラグインを管理する際に記述する。

依存関係の定義を記述する(libs.versions.toml)

「libs.versions.toml」の「libraries」に依存関係の定義を追加する。以下はApache Commons Lang3の定義を追加した例である。
この時、依存関係に対して命名を行うが、ケバブケース(ハイフン区切り)で記述する。

[versions]

[libraries]
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.12.0" }

[plugins]

バージョンNoを「versions」に別定義化することもできる。以下はJunitの定義を追加した例である。
この場合、依存関係の定義のバージョンの指定のキーが「version.ref」となり、値には「versions」に定義した変数名を指定する。

[versions]
junitVersion = 5.9.1

[libraries]
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.12.0" }
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitVersion" }

[plugins]

依存関係の定義を修正する(build.gradle)

依存関係の定義を「libraries」に命名した名称に書き換える。
「libraries」の名称はケバブケースだが、build.gradleで指定する際には、「.」区切りで記述する。
また、名称の接頭辞として「libs.」を追加する。

以下に修正例を示す。

plugins {
  id 'java'
  id 'org.springframework.boot' version '2.7.15'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '1.0.0'

java {
  sourceCompatibility = '17'
}

repositories {
  mavenCentral()
}

dependencies {
  // Spring
  implementation 'org.springframework.boot:spring-boot-starter'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'

  // Apache Commons Lang3
  // ★修正
  implementation libs.commons.lang3

  // JUnit
  // ★修正
  testImplementation libs.junit
}

tasks.named('test') {
  useJUnitPlatform()
}

プラグインの定義を記述する(libs.versions.toml)

「libs.versions.toml」の「plugins」にプラグインの定義を追加する。以下はio.spring.dependency-managementの定義を追加した例である。
この時、プラグインに対して命名を行うが、ケバブケース(ハイフン区切り)で記述する。

[versions]
junitVersion = 5.9.1

[libraries]
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.12.0" }
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitVersion" }

[plugins]
dependency-management = { id = "io.spring.dependency-management", version = "1.0.15.RELEASE" }

バージョンNoを「versions」に別定義化することもできる。以下はorg.springframework.bootの定義を追加した例である。
この場合、プラグインの定義のバージョンの指定のキーが「version.ref」となり、値には「versions」に定義した変数名を指定する。

[versions]
junitVersion = "5.9.1"
springBootPlugin = "2.7.15"

[libraries]
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.12.0" }
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitVersion" }

[plugins]
dependency-management = { id = "io.spring.dependency-management", version = "1.0.15.RELEASE" }
spring-boot-plugin = { id = "org.springframework.boot", version.ref = "springBootPlugin" }

プラグインの定義を修正する(build.gradle)

プラグインの定義を「plugins」に命名した名称に書き換える。
「plugins」の名称はケバブケースだが、build.gradleで指定する際には、「.」区切りで記述する。
名称の接頭辞として「libs.plugins.」を追加する。
Version Catalogを参照する定義の場合「id」ではなくて「alias」として記載する

以下に修正例を示す。

plugins {
  id 'java'
  // ★修正
  alias libs.plugins.spring.boot.plugin
  // ★修正
  alias libs.plugins.dependency.management
}

group = 'com.example'
version = '1.0.0'

java {
  sourceCompatibility = '17'
}

repositories {
  mavenCentral()
}

dependencies {
  // Spring
  implementation 'org.springframework.boot:spring-boot-starter'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'

  // Apache Commons Lang3
  implementation libs.commons.lang3

  // JUnit
  testImplementation libs.junit
}

tasks.named('test') {
  useJUnitPlatform()
}

参考

GradleのVersion catalogを使ったライブラリ管理
ビルドをバージョン カタログに移行する