【问题标题】:how does gradle resolve conflicting dependency versionsgradle如何解决冲突的依赖版本
【发布时间】:2019-05-14 16:54:48
【问题描述】:

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

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

ATLAS_VERSION = 1

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

ATLAS_VERSION = 2
MODULE_A_VERSION = 1

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

ATLAS_VERSION = 3
MODULE_B_VERSION = 1

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

【问题讨论】:

    标签: gradle build.gradle dependency-resolution


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      相关资源
      最近更新 更多