gradle如何解决冲突的依赖版本

时间:2019-05-14 16:54:49

标签: gradle build.gradle dependency-resolution

说我有3个模块,其中包含3个不同的build.gradle属性文件。

模块A v1在build.gradle中具有以下条目

ATLAS_VERSION = 1

模块B v1在build.gradle中具有以下条目

ATLAS_VERSION = 2
MODULE_A_VERSION = 1

模块C v1在其build.gradle中具有以下条目

ATLAS_VERSION = 3
MODULE_B_VERSION = 1

所以我的问题是:运行时将解决哪个ATLAS版本?

1 个答案:

答案 0 :(得分:1)

根据此Gradle文档Managing Transitive Dependencies,如果您没有为传递依赖项解析指定任何特定的约束,则应选择最高版本的ATLAS模块:

  

当Gradle尝试将对模块版本的依赖项解析为该模块的所有依赖项声明,所有可传递依赖项和所有依赖项约束时,均应考虑在内。选择符合所有条件的最高版本。

您可以通过以下简单的多项目构建来快速测试此行为:

settings.gradle

rootProject.name = 'demo'
include "A", "B", "C"

build.gradle

subprojects{
    apply plugin: "java"
    repositories{
        mavenCentral()
    }
}
project(':A') {
    dependencies{
        implementation 'commons-io:commons-io:1.2'
    }
}
project(':B') {
    dependencies{
        implementation project(":A")
        implementation 'commons-io:commons-io:2.0'
    }
}
project(':C') {
    dependencies{
        implementation project(":B")
        implementation 'commons-io:commons-io:2.6'
    }
}

然后您可以检查已选择commons-io的哪个版本,2.6

./gradlew C:dependencies

runtimeClasspath - Runtime classpath of source set 'main'.
+--- project :B
|    +--- project :A
|    |    \--- commons-io:commons-io:1.2 -> 2.6
|    \--- commons-io:commons-io:2.0 -> 2.6
\--- commons-io:commons-io:2.6