当同一个库被多次声明,或者当两个不同的库提供相同的功能时,在依赖解析期间可能会发生冲突。

理解冲突类型

在依赖解析期间,Gradle 处理两种类型的冲突

  1. 版本冲突:即当两个或多个依赖项需要给定的模块,但版本不同时。

  2. 能力冲突:即当依赖图中包含多个提供相同功能的构件时。

解决版本冲突

当组件声明两个依赖项时,会发生版本冲突

  • 依赖于同一个模块,例如 com.google.guava:guava

  • 但在不同的版本上,例如 20.025.1-android

    • 我们的项目本身依赖于 com.google.guava:guava:20.0

    • 我们的项目也依赖于 com.google.inject:guice:4.2.2,它本身依赖于 com.google.guava:guava:25.1-android

Gradle 将考虑所有请求的版本,无论它们出现在依赖图中的何处。默认情况下,它将选择这些版本中最高的版本。

解决能力冲突

Gradle 使用属性和能力来识别组件提供哪些构件。当依赖图中组件的两个或多个变体声明相同的能力时,就会发生能力冲突。

Gradle 通常会使构建失败并报告冲突。

您可以通过在 resolutionStrategy 代码块中指定要使用的能力来手动解决冲突

configurations.configureEach {
    resolutionStrategy.capabilitiesResolution.withCapability("com.example:logging") {
        selectHighestVersion()
    }
}

理解依赖约束

为了帮助 Gradle 解决依赖问题,提供了许多解决方案。

例如,dependencies 代码块提供了一个 constraints 代码块,可用于帮助 Gradle 选择特定版本的依赖项

dependencies {
    constraints {
        implementation("org.apache.commons:commons-lang3:3.12.0")
    }
}

下一步: 了解依赖解析 >>