在 Gradle 中声明依赖涉及到指定你的项目所依赖的库或文件。

理解生产者和消费者

在依赖管理中,理解生产者消费者之间的区别至关重要。

当你构建一个库时,你扮演的是生产者的角色,创建将被其他人(消费者)使用的构件。

当你依赖那个库时,你扮演的是消费者的角色。消费者可以被广义地定义为

  • 依赖于其他项目的项目。

  • 声明对特定构件的依赖的配置。

我们在依赖管理中做出的决策通常取决于我们正在构建的项目类型,特别是我们是什么类型的消费者

declaring dependencies 1

添加依赖

要在 Gradle 中添加依赖,你需要在你的构建脚本中使用 dependencies{} 代码块。

dependencies 代码块允许你指定各种类型的依赖,例如外部库、本地 JAR 文件或多项目构建中的其他项目。

Gradle 中的外部依赖使用配置名称(例如,implementationcompileOnlytestImplementation)后跟依赖表示法来声明,其中包括组 ID(group)、构件 ID(name)和版本。

build.gradle
dependencies {
    // Configuration Name + Dependency Notation - GroupID : ArtifactID (Name) : Version
    configuration('<group>:<name>:<version>')
}

注意

  1. Gradle 自动包含传递依赖,即你的依赖的依赖。

  2. Gradle 为依赖提供了几个 配置 选项,这些选项定义了依赖的使用范围,例如编译时、运行时或特定于测试的场景。

  3. 你可以在你的构建文件中指定 Gradle 应该在其中查找依赖的 仓库

理解依赖的类型

有三种类型的依赖:模块依赖、项目依赖和文件依赖。

1. 模块依赖

模块依赖是最常见的依赖。它们引用仓库中的一个模块

build.gradle.kts
dependencies {
    implementation("org.codehaus.groovy:groovy:3.0.5")
    implementation("org.codehaus.groovy:groovy-json:3.0.5")
    implementation("org.codehaus.groovy:groovy-nio:3.0.5")
}
build.gradle
dependencies {
    implementation 'org.codehaus.groovy:groovy:3.0.5'
    implementation 'org.codehaus.groovy:groovy-json:3.0.5'
    implementation 'org.codehaus.groovy:groovy-nio:3.0.5'
}

2. 项目依赖

项目依赖允许你声明对同一构建中其他项目的依赖。这在多项目构建中非常有用,其中多个项目是同一 Gradle 构建的一部分。

项目依赖通过引用项目路径来声明

build.gradle.kts
dependencies {
    implementation(project(":utils"))
    implementation(project(":api"))
}
build.gradle
dependencies {
    implementation project(':utils')
    implementation project(':api')
}

3. 文件依赖

在某些项目中,你可能不依赖于二进制仓库产品,如 JFrog ArtifactorySonatype Nexus 来托管和解析外部依赖。相反,你可能会将这些依赖托管在共享驱动器上,或者将它们检入版本控制系统,与项目源代码放在一起。

这些被称为文件依赖,因为它们表示没有任何 元数据(例如关于传递依赖、来源或作者的信息)附加到其上的文件。

dependency management file dependencies

要将文件作为配置的依赖添加,你只需传递一个 文件集合 作为依赖

build.gradle.kts
dependencies {
    runtimeOnly(files("libs/a.jar", "libs/b.jar"))
    runtimeOnly(fileTree("libs") { include("*.jar") })
}
build.gradle
dependencies {
    runtimeOnly files('libs/a.jar', 'libs/b.jar')
    runtimeOnly fileTree('libs') { include '*.jar' }
}
建议优先使用项目依赖或外部依赖,而不是文件依赖。

查看示例

让我们想象一个 Java 应用程序的示例,该应用程序使用 Guava,这是一组来自 Google 的核心 Java 库

declaring dependencies 2

该 Java 应用程序包含以下 Java 类

InitializeCollection.java
package org.example;

import com.google.common.collect.ImmutableMap;  // Comes from the Guava library

public class InitializeCollection {
    public static void main(String[] args) {
        ImmutableMap<String, Integer> immutableMap
            = ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1);
    }
}

要将 Guava 库作为依赖添加到你的 Gradle 项目,你必须将以下行添加到你的构建文件

build.gradle.kts
dependencies {
    implementation("com.google.guava:guava:23.0")
}
build.gradle
dependencies {
    implementation 'com.google.guava:guava:23.0'
}

其中

  • implementation 是配置。

  • com.google.guava:guava:23.0 指定库的组、名称和版本

    • com.google.guava 是组 ID。

    • guava 是构件 ID(即,名称)。

    • 23.0 是版本。

快速查看 Maven Central 中的 Guava 页面 作为参考。

列出项目依赖

dependencies 任务提供了你的项目依赖的概览。它帮助你理解正在使用的依赖、它们是如何解析的以及它们之间的关系,包括通过从命令行渲染依赖树来查看任何传递依赖。

此任务对于调试依赖问题(例如版本冲突或缺少依赖)特别有用。

例如,假设我们的 app 项目在其构建脚本中包含以下行

build.gradle.kts
dependencies {
    implementation("com.google.guava:guava:30.0-jre")
    runtimeOnly("org.apache.commons:commons-lang3:3.14.0")
}
build.gradle
dependencies {
    implementation("com.google.guava:guava:30.0-jre")
    runtimeOnly("org.apache.commons:commons-lang3:3.14.0")
}

app 项目上运行 dependencies 任务会产生以下结果

$ ./gradlew app:dependencies

> Task :app:dependencies

------------------------------------------------------------
Project ':app'
------------------------------------------------------------

implementation - Implementation dependencies for the 'main' feature. (n)
\--- com.google.guava:guava:30.0-jre (n)

runtimeClasspath - Runtime classpath of source set 'main'.
+--- com.google.guava:guava:30.0-jre
|    +--- com.google.guava:failureaccess:1.0.1
|    +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
|    +--- com.google.code.findbugs:jsr305:3.0.2
|    +--- org.checkerframework:checker-qual:3.5.0
|    +--- com.google.errorprone:error_prone_annotations:2.3.4
|    \--- com.google.j2objc:j2objc-annotations:1.3
\--- org.apache.commons:commons-lang3:3.14.0

runtimeOnly - Runtime-only dependencies for the 'main' feature. (n)
\--- org.apache.commons:commons-lang3:3.14.0 (n)

我们可以清楚地看到,对于 implementation 配置,已添加 com.google.guava:guava:30.0-jre 依赖。至于 runtimeOnly 配置,已添加 org.org.apache.commons:commons-lang3:3.14.0 依赖。

我们还看到了 com.google.guava:guava:30.0-jre 的传递依赖列表(这是 guava 库的依赖),例如 runtimeClasspath 配置中的 com.google.guava:failureaccess:1.0.1

下一步: 了解依赖配置 >>