1

假设我有 3 个模块和 3 个不同的 build.gradle 属性文件。

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

ATLAS_VERSION = 1

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

ATLAS_VERSION = 2
MODULE_A_VERSION = 1

Module C v1 在其 build.gradle 中有以下条目

ATLAS_VERSION = 3
MODULE_B_VERSION = 1

所以我的问题是:运行时会解决什么 ATLAS 版本?

4

1 回答 1

2

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

当 Gradle 尝试将依赖关系解析为模块版本时,会考虑所有带有版本的依赖声明、所有传递依赖以及该模块的所有依赖约束。选择符合所有条件的最高版本。

您可以使用下面的简单多项目构建快速测试此行为:

设置.gradle

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

构建.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
于 2019-05-14T19:45:50.697 回答