【问题标题】:Maven choosing wrong duplicate dependencyMaven选择错误的重复依赖
【发布时间】:2014-06-07 23:56:24
【问题描述】:

项目依赖于 google Guava 库,但父 maven 项目中有一个 google-collections(1.0 版)。

Maven 如何在编译时选择使用哪一个库?

【问题讨论】:

    标签: java maven dependencies duplicates


    【解决方案1】:

    来自official documentation

    [...] 从 Maven 2.0.9 开始,重要的是声明中的顺序:第一个声明获胜。

    “最近的定义” 表示使用的版本将是依赖关系树中与您的项目最接近的版本,例如。如果 A、B 和 C 的依赖项定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则在构建 A 时将使用 D 1.0,因为从 A 到 D 的路径通过E 更短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0

    另见reference book,关于Conflict Resolution

    【讨论】:

    • 我的问题是我使用了 guava(包括 google-collections),但是 maven 编译时使用了之前定义的 google-collection 依赖项。
    • 将您想要的 google-collections 版本声明为显式依赖项
    【解决方案2】:

    我找到了解决办法。

    鉴于: 父项目A 当前项目B

    我已经明确定义了对 A 的依赖并排除了不需要的子依赖。 像魅力一样工作。

    【讨论】:

      【解决方案3】:

      由于这两个工件具有不同的组和工件 ID,Maven 不会将它们视为重复项,并将两者都包含在构建中。这意味着当您在 com.google.commons.base 中引用类时使用的类定义将由类路径顺序决定。

      Maven classpath ordering is deterministic,所以把你想要使用的库(大概是 Guava)早点放在你的 pom 中,这就是使用的那个。 (要确认这一点,View a dependency tree in Maven?

      将工件与重复类混合通常不是一个好主意。如果可以,请在 Guava 上标准化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2020-06-29
        • 2011-01-19
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多