Gradle 支持用于声明版本的丰富模型,该模型允许组合不同级别的版本信息。术语及其含义如下所示,从最强到最弱

strictly

此版本表示法不匹配的任何版本都将被排除。这是最严格的版本声明。对于声明的依赖项,strictly 可以降级版本。当在传递依赖项上时,如果无法选择此子句可接受的版本,它将导致依赖项解析失败。有关详细信息,请参阅覆盖依赖项版本。此术语支持动态版本。

定义时,这将覆盖任何先前的 require 声明并清除先前的 reject

require

这意味着所选版本不能低于 require 接受的版本,但可以通过冲突解决提高版本,即使更高的版本具有排他性的更高边界。这是直接依赖项转换后的结果。此术语支持动态版本。

定义时,这将覆盖任何先前的 strictly 声明并清除先前的 reject

prefer

这是一个非常软的版本声明。仅当模块没有更强的不动态版本意见时才适用。此术语不支持动态版本。

定义可以补充 strictlyrequire

定义时,这将覆盖任何先前的 prefer 声明并清除先前的 reject

级别层次结构之外还有一个附加术语

拒绝

声明模块不接受特定版本。如果可选择的唯一版本也被拒绝,这将导致依赖项解析失败。此术语支持动态版本。

下表说明了许多用例,以及如何组合不同的术语以进行丰富的版本声明

表 1. 丰富的版本用例
此依赖项的哪些版本可以接受? strictly require prefer 拒绝 选择结果

使用版本 1.5 测试,相信所有未来版本都应该可以工作。

1.5

1.5 开始的任何版本,相当于 org:foo:1.5。接受升级到 2.4

使用 1.5 测试,根据语义版本控制进行软约束升级。

[1.0, 2.0[

1.5

1.02.0 之间的任何版本,如果其他人不在乎,则为 1.5。接受升级到 2.4
🔒

使用 1.5 测试,但遵循语义版本控制。

[1.0, 2.0[

1.5

1.02.0 之间的任何版本(独占),如果其他人不在乎,则为 1.5
覆盖传递依赖项中的版本。
🔒

与上述相同,已知 1.4 已损坏。

[1.0, 2.0[

1.5

1.4

1.02.0 之间的任何版本(独占),但 1.4 除外,如果其他人不在乎,则为 1.5
覆盖传递依赖项中的版本。
🔒

没有意见,适用于 1.5

1.5

如果没有其他意见,则为 1.5,否则为任何其他版本。

没有意见,首选最新版本。

latest.release

构建时的最新版本。
🔒

在边缘,最新版本,不降级。

latest.release

构建时的最新版本。
🔒

除了 1.5 之外没有其他版本。

1.5

1.5,或者如果另一个 strict 或更高的 require 约束不同意,则失败。
覆盖传递依赖项中的版本。

1.5 或其补丁版本(独占)。

[1.5,1.6[

最新的 1.5.x 补丁版本,或者如果另一个 strict 或更高的 require 约束不同意,则失败。
覆盖传递依赖项中的版本。
🔒

用锁 (🔒) 注释的行表示在这种情况下利用 依赖项锁定 是有意义的。与丰富的版本声明相关的另一个概念是发布 已解析版本 而不是已声明版本的可能性。

使用 strictly,特别是对于库,必须是一个经过深思熟虑的过程,因为它会对下游消费者产生影响。同时,如果使用得当,它将帮助消费者了解哪些库组合在他们的上下文中无法一起工作。有关更多信息,请参阅 覆盖依赖项版本

丰富的版本信息将以 Gradle 模块元数据格式保留。但是,转换为 Ivy 或 Maven 元数据格式将有损耗。将发布最高级别,即 strictlyrequire 超过 prefer。此外,任何 reject 都将被忽略。

丰富的版本声明是通过依赖项或约束声明上的 version DSL 方法访问的,该方法提供对 MutableVersionConstraint 的访问。

build.gradle.kts
dependencies {
    implementation("org.slf4j:slf4j-api") {
        version {
            strictly("[1.7, 1.8[")
            prefer("1.7.25")
        }
    }

    constraints {
        add("implementation", "org.springframework:spring-core") {
            version {
                require("4.2.9.RELEASE")
                reject("4.3.16.RELEASE")
            }
        }
    }
}
build.gradle
dependencies {
    implementation('org.slf4j:slf4j-api') {
        version {
            strictly '[1.7, 1.8['
            prefer '1.7.25'
        }
    }

    constraints {
        implementation('org.springframework:spring-core') {
            version {
                require '4.2.9.RELEASE'
                reject '4.3.16.RELEASE'
            }
        }
    }
}