当同一库被声明多次或两个不同的库提供相同功能时,在依赖解析期间可能会发生冲突。
理解冲突类型
在依赖解析期间,Gradle 处理两种类型的冲突
-
版本冲突:当两个或多个依赖项需要同一模块但版本不同时发生。
-
功能冲突:当依赖图中包含多个提供相同功能的 Artifact 时发生。
解决版本冲突
当一个组件声明了两个依赖项,并且这两个依赖项
-
依赖于同一个模块,例如
com.google.guava:guava
-
但版本不同,例如
20.0
和25.1-android
-
我们的项目自身依赖于
com.google.guava:guava:20.0
-
我们的项目还依赖于
com.google.inject:guice:4.2.2
,而它自身依赖于com.google.guava:guava:25.1-android
-
Gradle 会考虑依赖图中出现的所有请求版本。默认情况下,它将选择其中最高的版本。
解决功能冲突
Gradle 使用属性和功能来识别组件提供哪些 Artifact。当依赖图中的组件的两个或多个变体声明相同的功能时,就会发生功能冲突。
Gradle 通常会使构建失败并报告冲突。
您可以通过在 resolutionStrategy
块中指定要使用的功能来手动解决冲突
configurations.configureEach {
resolutionStrategy.capabilitiesResolution.withCapability("com.example:logging") {
selectHighestVersion()
}
}