软件项目通常依赖于其他库才能正常工作。这些库可以来源于同一构建中的其他项目,也可以来源于外部仓库。

Gradle 的依赖管理基础设施提供 API,用于声明、解析和暴露项目所需和所提供的二进制文件。

理解 Gradle 中的依赖管理对于将项目组织成组件非常重要。当你想重用现有库或需要在管理版本的同时升级这些库时,它也很重要。

让我们看一个 Java 项目,其代码依赖于 Guava,这是一套 Google 的核心 Java 库。该项目的构建文件包含以下内容:

build.gradle.kts
dependencies {
    implementation("com.google.guava:guava:32.1.2-jre") (2)
    api("org.apache.juneau:juneau-marshall:8.2.0")      (3)
}
build.gradle
dependencies {
    implementation("com.google.guava:guava:32.1.2-jre") (2)
    api("org.apache.juneau:juneau-marshall:8.2.0")      (3)
}

dependencies 代码块中,声明依赖时有三点需要注意:

  1. 配置:implementation,也称为应用依赖的作用域

  2. 模块 ID:com.google.guava:guava,由 group 和 artifact name 组成,它们是唯一标识的

  3. 版本:32.1.2-jre,这并非总是必需的

依赖可以是本地的或外部的。要让 Gradle 知道在哪里查找外部依赖,请在构建文件中使用 repositories{} 代码块。

让我们扩展一下我们的示例

build.gradle.kts
repositories {
    google()
    mavenCentral()
}


dependencies {
    implementation("com.google.guava:guava:32.1.2-jre") (2)
    api("org.apache.juneau:juneau-marshall:8.2.0")      (3)
}
build.gradle
repositories {
    google()
    mavenCentral()
}


dependencies {
    implementation("com.google.guava:guava:32.1.2-jre") (2)
    api("org.apache.juneau:juneau-marshall:8.2.0")      (3)
}

在此示例中,Gradle 从 Maven CentralGoogle 仓库获取 guavajuneau-marshall 依赖

学习基础知识

如果你想理解依赖管理的基础知识并且是 Gradle 的新手,请从此处开始。

1. 声明依赖

你可以向 Java 项目添加外部库,例如 Guava。这些库是项目的依赖项。它们使用构建文件中的 dependencies{} 代码块添加。

2. 依赖配置

为 Gradle 项目声明的每个依赖项都应用于特定的作用域,称为配置。这些配置通常通过应用插件创建,或者必须直接使用 API 创建。

3. 声明仓库

你可以声明仓库来告诉 Gradle 从哪里获取外部依赖。在构建期间,Gradle 定位并下载依赖项,这个过程称为依赖解析

4. 集中管理依赖

为了将依赖项及其版本声明在一个单一的、易于管理的位置(即集中管理),你可以使用平台版本目录

平台是一组旨在一起使用的模块。版本目录是一个集中式的依赖坐标列表,可以在多个项目中引用。

5. 管理约束和冲突

当同一个库被多次声明或不同的库提供相同的功能时,可能会出现冲突。这通常会导致构建失败。

你可以使用解析规则依赖锁定来管理冲突。

进阶概念

为了影响 Gradle 如何解析依赖项,理解其工作原理非常重要。

1. 依赖解析

Gradle 的依赖解析过程确定构建的声明依赖需要哪些模块和版本。它分两个步骤完成:图解析Artifact 解析

2. 图解析

图解析期间,Gradle 构建依赖图,解析版本冲突并确保选择了预期的依赖项。

3. 变体选择

变体选择通过根据属性Capabilities选择每个模块最兼容的变体来遍历已解析的依赖图。

4. Artifact 解析

最后,Artifact 解析是 Gradle 确定下载哪些文件或所选变体发布的Artifact并在构建期间使用的方式。