说我有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版本?
答案 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