Managing Dependencies
要管理 Spring Boot 应用程序中的依赖项,你可以选择应用 io.spring.dependency-management 插件,或者使用 Gradle 的原生 BOM 支持。前者的主要优势在于它提供了基于属性的托管版本自定义功能,而后者则可能带来更快的构建速度。
使用 Dependency Management Plugin 管理依赖
当你应用 io.spring.dependency-management 插件时,Spring Boot 的插件会自动从你所使用的 Spring Boot 版本中 导入 spring-boot-dependencies BOM。这为 Gradle 用户提供了与 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,该 BOM 使用属性来控制其所管理的依赖项的版本。完整的属性列表请参阅 Spring Boot 参考文档中的 Dependency Versions Properties 一节。
要自定义一个受管理的版本,需设置其对应的属性。例如,要自定义由 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 '4.0.2' apply false
}
plugins {
id("org.springframework.boot") version "4.0.2" apply false
}
Spring Boot 插件对 dependency management 插件的依赖意味着你可以直接使用 dependency management 插件,而无需显式声明对其的依赖。这也意味着你将自动使用与 Spring Boot 所用版本相同的 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 代码有点别扭。这是因为我们使用的是命令式的方式来应用依赖管理插件。
我们可以通过从根父项目应用该插件,或者像使用 Spring Boot 插件那样使用 plugins 块,使代码不那么笨拙。这种方法的一个缺点是,它迫使我们必须指定 dependency management 插件的版本:
plugins {
java
id("org.springframework.boot") version "4.0.2" apply false
id("io.spring.dependency-management") version "1.1.7"
}
dependencyManagement {
imports {
mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
}
}
深入学习
要了解更多关于 dependency management plugin 的功能,请参阅其 文档。
使用 Gradle 的 Bom 支持管理依赖
Gradle 允许通过将 BOM 声明为 platform 或 enforcedPlatform 依赖项来管理项目的版本。platform 依赖项将 BOM 中的版本视为推荐版本,依赖关系图中的其他版本和约束可能会导致使用不同于 BOM 中声明的版本。而 enforcedPlatform 依赖项则将 BOM 中的版本视为强制要求,会覆盖依赖关系图中找到的任何其他版本。
SpringBootPlugin 类提供了一个 BOM_COORDINATES 常量,可用于声明对 Spring Boot 的 bom 的依赖,而无需知道其 group ID、artifact ID 或 version,如下例所示:
- 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 版本都是针对一组特定的第三方依赖进行设计和测试的。覆盖版本可能会导致兼容性问题,应谨慎操作。