依存関係の管理

Spring Boot アプリケーションの依存関係を管理するには、io.spring.dependency-management [GitHub] (英語) プラグインを適用するか、Gradle のネイティブ bom サポートを使用します。前者の主な利点は、管理対象バージョンのプロパティベースのカスタマイズを提供することですが、後者を使用すると、ビルドが高速になる可能性があります。

依存関係管理プラグインによる依存関係の管理

io.spring.dependency-management [GitHub] (英語) プラグインを適用すると、Spring Boot のプラグインは、使用している Spring Boot のバージョンから spring-boot-dependencies bom を自動的にインポートします。これにより、Maven ユーザーが享受しているものと同様の依存関係管理エクスペリエンスが提供されます。たとえば、bom で管理される依存関係を宣言するときにバージョン番号を省略できます。この機能を使用するには、通常の方法で依存関係を宣言しますが、バージョン番号を省略します。

  • Groovy

  • Kotlin

dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
	implementation('org.springframework.boot:spring-boot-starter-data-jpa')
}
dependencies {
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
}

管理バージョンのカスタマイズ

依存関係管理プラグインの適用時に自動的にインポートされる spring-boot-dependencies bom は、プロパティを使用して、管理する依存関係のバージョンを制御します。これらのプロパティの完全なリストについては、Spring Boot リファレンスの依存関係バージョンのプロパティセクションを参照してください。

管理対象バージョンをカスタマイズするには、対応するプロパティを設定します。例: slf4j.version プロパティによって制御される SLF4J のバージョンをカスタマイズするには:

  • Groovy

  • Kotlin

ext['slf4j.version'] = '1.7.20'
extra["slf4j.version"] = "1.7.20"
各 Spring Boot リリースは、サードパーティの特定の依存関係セットに対して設計およびテストされています。バージョンを上書きすると互換性の問題が発生する可能性があるため、注意して行う必要があります。

Spring Boot の依存関係管理のみを使用

Spring Boot の依存関係管理は、Spring Boot のプラグインをそのプロジェクトに適用せずにプロジェクトで使用できます。SpringBootPlugin クラスは、グループ ID、アーティファクト ID、バージョンを知らなくても BOM をインポートするために使用できる BOM_COORDINATES 定数を提供します。

まず、Spring Boot プラグインに依存するようにプロジェクトを構成しますが、適用しません。

  • Groovy

  • Kotlin

plugins {
	id 'org.springframework.boot' version '3.4.1' apply false
}
plugins {
	id("org.springframework.boot") version "3.4.1" apply false
}

Spring Boot プラグインの依存関係管理プラグインへの依存関係は、依存関係を宣言することなく依存関係管理プラグインを使用できることを意味します。これは、Spring Boot が使用するのと同じバージョンの依存関係管理プラグインを自動的に使用することも意味します。

依存関係管理プラグインを適用し、Spring Boot の bom をインポートするように構成します。

  • Groovy

  • Kotlin

apply plugin: 'io.spring.dependency-management'

dependencyManagement {
	imports {
		mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
	}
}
apply(plugin = "io.spring.dependency-management")

the<DependencyManagementExtension>().apply {
	imports {
		mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
	}
}

上記の Kotlin コードは少し厄介です。これは、依存関係管理プラグインを必須の方法で適用しているためです。

ルートの親プロジェクトからプラグインを適用するか、Spring Boot プラグインで行っているように plugins ブロックを使用することで、コードをより扱いにくくすることができます。このメソッドの欠点は、依存関係管理プラグインのバージョンを指定する必要があることです:

plugins {
	java
	id("org.springframework.boot") version "3.4.1" apply false
	id("io.spring.dependency-management") version "1.1.7"
}

dependencyManagement {
	imports {
		mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
	}
}

さらに学ぶ

依存関係管理プラグインの機能の詳細については、そのドキュメント (英語) を参照してください。

Gradle の Bom サポートによる依存関係の管理

Gradle を使用すると、BOM を使用して、プロジェクトを platform または enforcedPlatform 依存関係として宣言することにより、プロジェクトのバージョンを管理できます。platform 依存関係は、BOM 内のバージョンを推奨として扱い、依存関係グラフ内の他のバージョンと制約により、BOM で宣言されたもの以外のバージョンの依存関係が使用される場合があります。enforcedPlatform 依存関係は、BOM のバージョンを要件として扱い、依存関係グラフで見つかった他のバージョンをオーバーライドします。

次の例に示すように、SpringBootPlugin クラスは BOM_COORDINATES 定数を提供し、これを使用して、グループ ID、アーティファクト ID、バージョンを知らなくても、Spring Boot の bom への依存関係を宣言できます。

  • Groovy

  • Kotlin

dependencies {
	implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
}
dependencies {
	implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
}

プラットフォームまたは強制されたプラットフォームは、それが宣言された構成のバージョン、または宣言された構成から拡張された構成のバージョンのみを制約します。その結果、複数の構成で同じ依存関係を宣言する必要がある場合があります。

管理バージョンのカスタマイズ

Gradle の bom サポートを使用する場合、spring-boot-dependencies のプロパティを使用して、それが管理する依存関係のバージョンを制御することはできません。代わりに、Gradle が提供するメカニズムの 1 つを使用する必要があります。そのようなメカニズムの 1 つが解決戦略です。SLF4J のモジュールはすべて org.slf4j グループにあるため、次の例に示すように、特定のバージョンを使用するようにそのグループのすべての依存関係を構成することにより、バージョンを制御できます。

  • Groovy

  • Kotlin

configurations.all {
	resolutionStrategy.eachDependency { DependencyResolveDetails details ->
		if (details.requested.group == 'org.slf4j') {
			details.useVersion '1.7.20'
		}
	}
}
configurations.all {
    resolutionStrategy.eachDependency {
        if (requested.group == "org.slf4j") {
            useVersion("1.7.20")
        }
    }
}
各 Spring Boot リリースは、サードパーティの特定の依存関係セットに対して設計およびテストされています。バージョンを上書きすると互換性の問題が発生する可能性があるため、注意して行う必要があります。