Gradle依赖管理的三种方式

Gradle依赖管理的三种方式

Administrator 467 2023-09-14

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中的依赖。

  1. 创建buildSrc项目:在项目根目录下创建一个名为buildSrc的文件夹,Gradle会自动识别它并将其作为构建脚本的一部分。
  2. buildSrc项目中创建Groovy或Kotlin类(通常在src/main/groovysrc/main/kotlin目录下),用于管理依赖。这些类可以包含依赖版本号的定义。
  3. 在项目的构建脚本中,可以直接引用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)通常是全局配置,不能在allprojectssubprojects块中直接使用。这是因为版本目录的配置是针对整个Gradle项目的,而不是针对单个项目或子项目的。

dependencies {
    val springCloudBom = platform(libs.springCloud.origin)
    val springCloudAlibabaBom = platform(libs.springCloud.alibaba)

    implementation(springCloudBom)
    implementation(springCloudAlibabaBom)
    implementation(libs.lombok)
}

img.png

TOML 文件由4个主要部分组成

  • [versions] 用于声明可以被依赖项引用的版本
  • [libraries] 用于声明依赖的别名
  • [bundles] 用于声明依赖包(依赖组)
  • [plugins] 用于声明插件