在一个典型的 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()
    }
}

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

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