学习项目依赖和 Gradle 依赖管理的基础知识。

在本节中,您将

  • 理解项目依赖

  • 检查项目依赖

  • 使用 Build Scan 分析依赖

  • 更新项目依赖

  • 理解传递依赖

  • 添加版本目录

步骤 0. 开始之前

  1. 您在 第一部分 中初始化了 Java 应用。

  2. 您在 第二部分 中运行了几个 task。

步骤 1. 理解版本目录

版本目录用于在中心位置声明项目的所有直接依赖项。

它由 Gradle init 在 gradle/libs.versions.toml 中创建,并在子项目构建文件中引用。

libs.versions.toml
[versions]
guava = "32.1.2-jre"
junit-jupiter = "5.10.0"

[libraries]
guava = { module = "com.google.guava:guava", version.ref = "guava" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }

要引用版本目录中定义的库

dependencies {
    implementation(libs.guava)
    testImplementation(libs.junit.jupiter)
}
dependencies {
    implementation libs.guava
    testImplementation libs.junit.jupiter
}

在本例中,libs.guavalibs.junit.jupiter 引用了版本目录中定义的相应库。

使用 libs.junit.jupiter 语法是因为键包含连字符,这是一个特殊字符。

与直接在构建脚本中声明依赖项相比,版本目录提供了许多优势

  • Gradle 从目录生成类型安全的访问器,以便您可以轻松地在 IDE 中使用自动完成功能添加依赖项。

  • 它是一个集中声明依赖项版本的位置,以便任何更改都适用于每个子项目。

步骤 2. 理解项目依赖

Gradle 为依赖管理和自动化提供了出色的支持。

让我们再次查看我们的构建脚本(build.gradle(.kts) 文件),特别是以下部分

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation(libs.junit.jupiter)

    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    // This dependency is used by the application.
    implementation(libs.guava)
}
repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter

    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    // This dependency is used by the application.
    implementation libs.guava
}

Gradle 依赖管理中的一些关键概念包括

仓库 (Repositories) - 依赖项的来源 → mavenCentral()

Maven Central 是由 Maven 社区提供并由 Sonatype 支持的 jar 文件、插件和库的集合。它是 Java 的事实上的公共构件存储库,并被许多构建系统使用。

依赖 (Dependencies) - 通过配置类型声明的依赖项 → libs.junit.jupiterlibs.guava

Gradle 需要特定信息才能找到依赖项。让我们看看 libs.guavacom.google.guava:guava:32.1.2-jrelibs.junit.jupiterorg.junit.jupiter:junit-jupiter-api:5.9.1;它们分解如下

描述 com.google.guava:guava:32.1.2-jre org.junit.jupiter:junit-jupiter-api:5.9.1

Group(组织)

组织的标识符

com.google.guava

org.junit.jupiter

Name(名称)

依赖项标识符

guava

junit-jupiter-api

Version(版本)

要导入的版本号

32.1.2-jre

5.9.1

步骤 3. 理解传递依赖

传递依赖 是依赖项的依赖项。

为了使我们的 guava 依赖项工作,它需要一个名为 failureaccess 的库。因此,failureaccess 是项目的传递依赖项。

步骤 4. 查看项目依赖

您可以使用 ./gradlew :app:dependencies 命令在终端中查看依赖树

$ ./gradlew :app:dependencies

> Task :app:dependencies

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

...

compileClasspath - Compile classpath for source set 'main'.
\--- com.google.guava:guava:32.1.2-jre
     +--- com.google.guava:guava-parent:32.1.2-jre
     |    +--- com.google.code.findbugs:jsr305:3.0.2 (c)
     |    +--- org.checkerframework:checker-qual:3.33.0 (c)
     |    +--- com.google.errorprone:error_prone_annotations:2.18.0 (c)
     |    \--- com.google.j2objc:j2objc-annotations:2.8 (c)
     +--- 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.33.0
     +--- com.google.errorprone:error_prone_annotations -> 2.18.0
     \--- com.google.j2objc:j2objc-annotations -> 2.8

输出清楚地表明 com.google.guava:guava:32.1.2-jre 依赖于 com.google.guava:failureaccess:1.0.1

步骤 5. 在 Build Scan® 中查看依赖

要使用 Build Scan 查看依赖项,请使用可选的 --scan 标志运行 build task。

tutorial 目录中,输入以下命令并按照提示接受条款

$ ./gradlew build --scan

BUILD SUCCESSFUL in 423ms
7 actionable tasks: 7 up-to-date

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes

Gradle Terms of Service accepted.

Publishing build scan...
https://gradle.com/s/link

Build Scan 是构建的可共享和集中记录,可作为 Gradle 的免费服务使用。

点击提示中提供的链接:https://gradle.com/s/link

您将需要接受服务条款才能使用 Build Scan。

您将需要使用您的电子邮件激活 Build Scan

build scan prompt

您将在收件箱中收到扫描的最终链接,该链接应如下所示

build scan results

打开菜单中的 Dependencies(依赖) 选项卡,展开 compileClasspathruntimeClasspathtestCompileClasspathtestRuntimeClasspath

build scan dependencies

正如预期的那样,我们可以看到声明的依赖项 junitguava 被 Gradle 用于编译、运行和测试应用。

展开窗口中的 com.google.guava:guava:32.1.2-jreorg.junit.jupiter:junit-jupiter:5.9.1

build scan trans dependencies

junitguava 下有几个传递依赖项。例如,com.google.code.findbugs:jsr305:3.0.2 传递依赖项来自 com.google.guava:guava:32.1.2-jre 依赖项。

步骤 6. 更新项目依赖

添加和更改依赖项在构建文件和版本目录中完成。

让我们更改 guava 版本,看看这如何影响依赖树。

将版本目录中的 guava 依赖项更改为

gradle/libs.versions.toml
[versions]
guava = "30.0-jre"
junit-jupiter = "5.10.0"

[libraries]
guava = { module = "com.google.guava:guava", version.ref = "guava" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }

如果您使用 IntelliJ 更改文件,请不要忘记点击 sync Gradle 按钮

intellij idea dep man

运行 ./gradlew build --scan 并查看 Build Scan 结果

build scan change

在终端中运行 ./gradlew :app:dependencies 以检查依赖树中的更改

...

compileClasspath - Compile classpath for 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

...

很明显,guava 依赖项已更新到版本 30.0,并且传递依赖项也已更改。

步骤 7. 运行 Java 应用

最后,确保一切正常,使用 run task,可以在终端或 IDE 中运行

./gradlew run

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE

> Task :app:run
Hello World!

下一步: 应用插件 >>