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() }