在一个典型的 Gradle 项目中,存在多种配置,例如 compileClasspath
和 runtimeClasspath
。
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 允许您在配置之间强制执行依赖项解析的一致性。通过声明某些配置应与其他配置一致地解析依赖项,您可以确保共享依赖项在两种配置中具有相同的版本。
依赖解析一致性是一项孵化中的功能。 |
实现一致性解析
例如,为了确保 runtimeClasspath
与 compileClasspath
一致,您可以如下配置您的 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()
}
}
此配置确保所有运行时类路径都与其相应的编译类路径一致,从而促进可靠和可预测的构建。
通过实现依赖解析一致性,您可以防止细微的错误,并保持项目中不同类路径之间依赖项版本的一致性。