依赖管理

要在 Spring Boot 应用中管理依赖,可以选择应用 io.spring.dependency-management 插件,或使用 Gradle 原生的 bom 支持。 前者的主要优势在于支持基于属性的受管版本自定义,而后者通常能带来更快的构建速度。

使用 Dependency Management 插件管理依赖

当你应用 io.spring.dependency-management 插件时,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")
}

自定义受管版本

通过应用 dependency management 插件自动导入的 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 类提供了 BOM_COORDINATES 常量,可用于导入 bom,无需手动指定 group ID、artifact ID 或版本。

首先,将项目配置为依赖 Spring Boot 插件,但不应用它:

  • Groovy

  • Kotlin

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

Spring Boot 插件对 dependency management 插件的依赖意味着你无需单独声明 dependency management 插件依赖即可使用它。 这也意味着你会自动使用与 Spring Boot 相同版本的 dependency management 插件。

应用 dependency management 插件后,配置其导入 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 代码略显繁琐,这是因为采用了命令式方式应用 dependency management 插件。

可以通过在根父项目中应用插件,或像 Spring Boot 插件那样使用 plugins 块,使代码更简洁。 这种方式的缺点是必须指定 dependency management 插件的版本:

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

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

深入了解

如需了解 dependency management 插件的更多功能,请参阅其 文档

使用 Gradle 的 Bom 支持管理依赖

Gradle 允许通过声明 platformenforcedPlatform 依赖来使用 bom 管理项目版本。 platform 依赖将 bom 中的版本视为推荐值,依赖图中的其他版本和约束可能导致实际使用的依赖版本与 bom 声明不同。 enforcedPlatform 依赖则将 bom 中的版本视为强制要求,会覆盖依赖图中发现的任何其他版本。

SpringBootPlugin 类提供了 BOM_COORDINATES 常量,可用于声明对 Spring Boot bom 的依赖,无需手动指定 group ID、artifact ID 或版本,示例如下:

  • Groovy

  • Kotlin

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

platform 或 enforced platform 只会约束其声明的配置或从该配置扩展的配置中的版本。 因此,可能需要在多个配置中声明相同的依赖。

自定义受管版本

使用 Gradle 的 bom 支持时,无法通过 spring-boot-dependencies 的属性控制其所管理依赖的版本。 必须使用 Gradle 提供的机制之一。 其中一种机制是 resolution strategy。 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 版本都针对特定的第三方依赖集进行设计和测试。 覆盖版本可能导致兼容性问题,操作需谨慎。