管理依赖

要管理 Spring Boot 应用中的依赖,你可以应用以下几个io.spring.dependency-management插件或使用 Gradle 原生的 BOM 支持。 前者的主要好处是它支持基于属性的托管版本定制,而使用后者则可能带来更快的构建。spring-doc.cadn.net.cn

使用依赖管理插件管理依赖

当你应用io.spring.dependency-management插件,Spring Boot 的插件会自动导入Spring Boot依赖关系BOM来自你所使用的 Spring Boot 版本。这提供了与 Maven 用户类似的依赖管理体验。例如,它允许你在声明 BOM 中管理的依赖时省略版本号。要使用此功能,可以按常规方式声明依赖,但省略版本号:spring-doc.cadn.net.cn

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依赖关系当应用依赖管理插件时自动导入的BOM,使用属性来控制其所管理依赖的版本。在Spring Boot参考中浏览依赖版本属性部分,查看这些属性的完整列表。spring-doc.cadn.net.cn

要自定义受管理版本,你需要设置其对应属性。例如,要自定义由SLF4J.版本财产:spring-doc.cadn.net.cn

ext['slf4j.version'] = '1.7.20'
extra["slf4j.version"] = "1.7.20"
每个 Spring Boot 版本都针对特定的第三方依赖进行设计和测试。覆盖版本可能导致兼容性问题,因此应谨慎作。

Spring Boot 的依赖管理隔离应用

Spring Boot 的依赖管理可以在项目中使用,而无需将 Spring Boot 的插件应用到该项目上。 这SpringBootPlugin类提供BOM_COORDINATES常数可用于导入BOM,无需知道其组ID、工件ID或版本。spring-doc.cadn.net.cn

首先,配置项目依赖 Spring Boot 插件,但不要应用它:spring-doc.cadn.net.cn

/*
 * Copyright 2012-present the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the License);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

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

Spring Boot 插件对依赖管理插件的依赖意味着你可以使用依赖管理插件而无需声明依赖。这也意味着你会自动使用与 Spring Boot 相同的依赖管理插件版本。spring-doc.cadn.net.cn

应用依赖管理插件,然后配置它导入 Spring Boot 的 bom:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

我们可以通过从根项目应用插件,或者使用插件我们正在为 Spring Boot 插件做的 block 。这种方法的一个缺点是它迫使我们指定依赖管理插件的版本:spring-doc.cadn.net.cn

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

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

了解更多

想了解更多依赖管理插件的功能,请参阅其文档spring-doc.cadn.net.cn

使用 Gradle 的 Bom 支持管理依赖

Gradle 允许通过声明 BOM 来管理项目的版本平台强制执行平台Dependency。 一个平台依赖性将BOM中的版本视为推荐值,依赖图中的其他版本和约束可能导致使用BOM中声明的非依赖版本。 一强制执行平台依赖系统将BOM中的版本视为需求,它们会覆盖依赖图中发现的其他版本。spring-doc.cadn.net.cn

SpringBootPlugin类提供BOM_COORDINATES该常量可用于声明对 Spring Boot BOM 的依赖,而无需知道其组 ID、工件 ID 或版本,如下示例所示:spring-doc.cadn.net.cn

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

平台或强制平台只会限制其被声明的配置版本或从该配置延伸出来的版本。因此,可能需要在多个配置中声明相同的依赖关系。spring-doc.cadn.net.cn

定制托管版本

使用 Gradle 的 BOM 支持时,不能使用 Gradle 的属性Spring Boot依赖关系以控制它所管理依赖的版本。相反,你必须使用Gradle提供的某种机制。其中一种机制是解析策略。SLF4J的模块都在org.slf4j因此,可以通过配置该组中的每个依赖使用特定版本来控制,如下示例所示:spring-doc.cadn.net.cn

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 版本都针对特定的第三方依赖进行设计和测试。覆盖版本可能导致兼容性问题,因此应谨慎作。