在典型的 Gradle 项目中,存在多个配置,例如 compileClasspathruntimeClasspath

build.gradle.kts
dependencies {
    implementation("org.codehaus.groovy:groovy:3.0.1")
    runtimeOnly("io.vertx:vertx-lang-groovy:3.9.4")
}
build.gradle
dependencies {
    implementation 'org.codehaus.groovy:groovy:3.0.1'
    runtimeOnly 'io.vertx:vertx-lang-groovy:3.9.4'
}

这些配置是独立解析的,这可能导致同一依赖项在不同配置中出现不同版本的情况。

例如,一个在编译期间使用的库 (compileClasspath) 可能解析到版本 1.0,而在运行时 (runtimeClasspath),由于额外的传递性依赖项,它可能解析到版本 1.1。这种差异可能导致意外行为或运行时错误。

为了解决这个问题,Gradle 允许您强制在配置之间保持依赖项解析的一致性。通过声明某些配置应与另一些配置保持依赖项解析的一致性,您可以确保共享的依赖项在两个配置中具有相同的版本。

依赖解析一致性是一个孵化中的功能。

实现一致解析

例如,为了确保 runtimeClasspathcompileClasspath 一致,您可以如下配置您的 build.gradle(.kts)

build.gradle.kts
configurations {
    runtimeClasspath.get().shouldResolveConsistentlyWith(compileClasspath.get())
}
build.gradle
configurations {
    runtimeClasspath.shouldResolveConsistentlyWith(compileClasspath)
}

此设置指示 Gradle 对齐 runtimeClasspath 中的依赖项版本与 compileClasspath 中解析的版本。如果出现无法协调的版本冲突,Gradle 将使构建失败,提示您解决不一致问题。

Java 生态系统中的自动配置

对于 Java 项目,Gradle 提供了一种便捷的方法来在所有源集之间强制执行此一致性

build.gradle.kts
java {
    consistentResolution {
        useCompileClasspathVersions()
    }
}
build.gradle
java {
    consistentResolution {
        useCompileClasspathVersions()
    }
}

此配置确保所有运行时类路径与其对应的编译类路径保持一致,从而促进可靠和可预测的构建。

通过实现依赖解析一致性,您可以防止细微的错误,并在项目的不同类路径中保持依赖项版本的一致性。