ext
在项目的build.gradle
文件中使用ext
块来定义全局变量,然后在依赖中引用这些变量。这是一种简单的方式来管理依赖版本。
// 在build.gradle中定义全局变量
ext {
// 依赖版本
springVersion = '5.2.10.RELEASE'
junitVersion = '5.7.0'
}
dependencies {
implementation "org.springframework:spring-core:$springVersion"
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
}
也可以单独定义一个versions.gralde
文件,在其中配置版本信息
ext {
}
然后在模块下的 build.gradle 使用则通过 apply
方式引入。 添加
apply from "versions.gradle"
在build.gradle.ktx
中可以这样写
buildscript {
extra["springBootVersion"] = "3.0.0"
extra["springCloudVersion"] = "2022.0.3"
extra["springCloudAlibabaVersion"] = "2022.0.0.0-RC2"
extra["lombokVersion"] = "1.18.28"
}
allprojects {
...
configure<DependencyManagementExtension> {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
mavenBom("com.alibaba.cloud:spring-cloud-alibaba-dependencies:${property("springCloudAlibabaVersion")}")
}
dependencies {
dependency("org.projectlombok:lombok:${property("lombokVersion")}")
}
}
...
}
优点:
- 简单易懂,适用于小型项目。
- 可以在一个地方集中管理依赖版本。
缺点
- 不适用于大型项目,容易导致
build.gradle
文件变得臃肿。 - 不支持适应性版本解析(如动态版本号)。
buildSrc
当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。然后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中, buildSrc 是 Gradle 项目根目录下的一个目录,它可以包含我们的构建逻辑,与脚本插件相比,buildSrc 应该是首选,因为它更易于维护、重构和测试代码
适用于中大型项目,特别是当多个子项目需要共享相同的依赖版本时。
使用单独的buildSrc
项目来管理依赖,这个项目包含了构建脚本和依赖定义。每个子项目可以引用buildSrc
中的依赖。
- 创建
buildSrc
项目:在项目根目录下创建一个名为buildSrc
的文件夹,Gradle会自动识别它并将其作为构建脚本的一部分。 - 在
buildSrc
项目中创建Groovy或Kotlin类(通常在src/main/groovy
或src/main/kotlin
目录下),用于管理依赖。这些类可以包含依赖版本号的定义。 - 在项目的构建脚本中,可以直接引用
buildSrc
中定义的类来获取依赖版本号。
示例:
在buildSrc/src/main/groovy
目录下创建一个名为Dependencies.groovy
的Groovy类,用于定义依赖版本号:
// buildSrc/src/main/groovy/Dependencies.groovy
class Dependencies {
static final String springVersion = '5.2.10.RELEASE'
static final String junitVersion = '5.7.0'
}
然后,在项目的build.gradle
文件中,你可以引用这些版本号:
// 项目的 build.gradle 文件
dependencies {
implementation "org.springframework:spring-core:${Dependencies.springVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${Dependencies.junitVersion}"
}
优点:
这种方式的优点是可以集中管理依赖版本,使构建脚本更加清晰,特别是在多个子项目需要使用相同的版本号时。这对于大型项目尤其有用,因为它可以减少重复工作和版本号不一致的问题。
缺点
需要额外的buildSrc
项目,可能稍微复杂一些
toml–Version Catalogs
特点:
- 对所有module可见,可统一管理所有module的依赖,Gradle会为每个依赖目录生成一个类型安全的访问器,如:libs.coreKtx。 每个依赖目录对构建项目都是可见的,确保依赖项的版本适用于每个子项目或模块
- 依赖项除了可以声明为单个依赖目录,还可以将多个依赖项声明为依赖目录组。即支持声明依赖bundles, 即总是一起使用的依赖可以组合在一起,
- 支持版本号与依赖名分离,可以在多个依赖间共享版本号
- 支持在单独的libs.versions.toml文件中配置依赖
- 支持在项目间共享依赖
通过 settings.gradle.ktx 声明 version catalogs
在 settings.gradle.ktx
中声明
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
library("springBoot", "org.springframework.boot", "spring-boot-gradle-plugin").version("3.0.0")
}
}
}
在build.gralde.ktx
中使用
dependencies {
classpath(libs.springBoot)
}
通过 TOML 文件声明 version catalogs
除了在 settings.gradle
文件中直接声明依赖目录,官方更推荐使用 TOML 文件来声明依赖目录
首先在项目根目录下创建 libs.versions.toml
文件,文件名可以任意取,并编写如下依赖内容:
[versions]
springBoot = "3.0.0"
springCloud = "2022.0.3"
springCloudAlibaba = "2022.0.0.0-RC2"
lombok = "1.18.28"
[libraries]
springBoot = {group = "org.springframework.boot", name = "spring-boot-gradle-plugin", version.ref = "springBoot"}
springCloud = {module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "springCloud"}
springCloud-Alibaba = {module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "springCloudAlibaba"}
lombok = {module = "org.projectlombok:lombok", version.ref = "lombok"}
在 settings.gradle.ktx
引入文件,注意,默认值是libs.versions.toml
,默认位置为project/gradle/
,所以当在这个目录下且使用这个名字的时候不需要显式的引入
dependencyResolutionManagement {
// 使用版本目录
versionCatalogs {
create("libs") {
from(files("./gradle/libs.versions.toml"))
}
}
}
在Gradle中,dependencyResolutionManagement
块中的版本目录(Version Catalogs)通常是全局配置,不能在allprojects
和subprojects
块中直接使用。这是因为版本目录的配置是针对整个Gradle项目的,而不是针对单个项目或子项目的。
dependencies {
val springCloudBom = platform(libs.springCloud.origin)
val springCloudAlibabaBom = platform(libs.springCloud.alibaba)
implementation(springCloudBom)
implementation(springCloudAlibabaBom)
implementation(libs.lombok)
}
TOML 文件由4个主要部分组成
- [versions] 用于声明可以被依赖项引用的版本
- [libraries] 用于声明依赖的别名
- [bundles] 用于声明依赖包(依赖组)
- [plugins] 用于声明插件