1. 概述

Gradle 是 JVM 项目中最流行的构建工具之一。它提供了多种方式来声明和控制依赖项版本。

在这个简短的教程中,我们将探讨如何在 Gradle 中定义最新的依赖项版本。首先,我们将调查可能想要定义依赖项版本的不同方法。然后,我们将创建一个小型 Gradle 项目,其中包含一些第三方库。最后,我们将分析 Gradle 的依赖树,了解它如何处理不同的版本声明。

2. 定义版本

2.1. 精确版本

这是声明依赖项版本的最直接方法。我们只需在应用程序中指定我们想要使用的精确版本,例如 1.0

大多数官方依赖通常只使用数字版本,如 3.2.1。然而,依赖项版本本质上是字符串,因此也可以包含字符。例如,Spring 有一个 5.2.22.RELEASE 版本。

2.2. Maven 风格的版本范围

如果我们不想指定确切的依赖项版本,可以使用 Maven 风格的版本范围,如 \[1.0, 2.0)(1.0, 2.0]

方括号 [] 表示包含边界,而圆括号 () 表示不包含边界。此外,在版本声明中可以混合使用不同类型的括号

2.3. 前缀/通配符版本范围

我们可以使用 + 通配符来指定依赖项的版本范围——例如,1.+.*Gradle 将查找与通配符 + 之前的部分完全匹配的依赖项版本

2.4. 使用 latest 关键字

Gradle 提供了两个特殊版本关键字,可以用于任何依赖项:

  • latest.integration 会匹配最高版本的 SNAPSHOT 模块
  • latest.release 会匹配最高版本的非 SNAPSHOT 模块

3. 版本范围的优缺点

使用 Maven 风格或通配符版本范围作为依赖项版本是有用的。但是,这种方法也有其优点和缺点。

版本范围的主要优势在于始终可以获得最新依赖。每次构建应用程序时,我们无需搜索新的依赖项发布。

然而,总是拥有最新依赖也可能是一个大缺点。由于我们在应用中使用的第三方依赖项在每次发布之间行为可能会有所不同,这可能导致我们的应用程序在一次构建与下一次构建之间的行为发生变化,而我们并未察觉。

根据我们的需求,为依赖项指定版本范围可能是有帮助的。然而,在使用之前,我们必须确保依赖项遵循的版本算法,并对其谨慎处理。

4. 创建测试应用

让我们创建一个简单的 Gradle 应用程序,尝试使用不同版本声明的几个依赖项。

我们的应用程序将只有一个文件,即 build.gradle

plugins {
    id 'java'
}

group = "com.baeldung.gradle"
version = "1.0.0-SNAPSHOT"
sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
}

接下来,我们将添加一些来自 [org.apache.commons](https://mvnrepository.com/artifact/org.apache.commons) 的依赖项,并使用不同的版本声明。

让我们从最简单的开始,精确版本:

implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'

现在,我们使用 Maven 风格的版本范围:

implementation group: 'org.apache.commons', name: 'commons-math3', version: '[3.4, 3.5)'

在这里,我们指定了希望 commons-math3 的版本在 3.4(包含)到 3.5(不包含)之间。

下一个依赖将使用通配符版本范围:

implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.+'

我们希望获取最新匹配 4. 前缀的 commons-collections4

最后,我们将使用 Gradle 的 latest.release 关键字:

implementation group: 'org.apache.commons', name: 'commons-text', version: 'latest.release'

这是 build.gradle 文件中完整的依赖项部分:

dependencies {
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
    implementation group: 'org.apache.commons', name: 'commons-math3', version: '[3.4, 3.5)'
    implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.+'
    implementation group: 'org.apache.commons', name: 'commons-text', version: 'latest.release'
}

现在,让我们看看 Gradle 如何解析这些版本声明。

5. 显示依赖树

让我们使用 Gradle 的 dependencies 任务查看依赖报告:

$ gradle dependencies

compileClasspath - Compile classpath for source set 'main'.
+--- org.apache.commons:commons-lang3:3.12.0
+--- org.apache.commons:commons-collections4:4.+ -> 4.4
+--- org.apache.commons:commons-math3:[3.4, 3.5) -> 3.4.1
\--- org.apache.commons:commons-text:latest.release -> 1.10.0

在撰写本文时,符合指定范围的最新 commons-math3 版本是 3.4.1。我们可以看到 Gradle 使用了这个版本。

此外,4.4 是符合 4.+ 通配符的最新 commons-collections4 版本。

同样,1.10.0commons-text 最新发布的稳定版本。

6. 总结

在这篇文章中,我们学习了如何在 Gradle 中以各种方式声明依赖项版本。首先,我们了解了如何在 Gradle 构建脚本中指定精确版本和版本范围,然后尝试了几种表达依赖的方式。最后,我们检查了 Gradle 如何处理这些版本。

如往常一样,示例代码可在 GitHub 查看。