【发布时间】:2014-06-07 23:56:24
【问题描述】:
项目依赖于 google Guava 库,但父 maven 项目中有一个 google-collections(1.0 版)。
Maven 如何在编译时选择使用哪一个库?
【问题讨论】:
标签: java maven dependencies duplicates
项目依赖于 google Guava 库,但父 maven 项目中有一个 google-collections(1.0 版)。
Maven 如何在编译时选择使用哪一个库?
【问题讨论】:
标签: java maven dependencies duplicates
[...] 从 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。
【讨论】:
我找到了解决办法。
鉴于: 父项目A 当前项目B
我已经明确定义了对 A 的依赖并排除了不需要的子依赖。 像魅力一样工作。
【讨论】:
由于这两个工件具有不同的组和工件 ID,Maven 不会将它们视为重复项,并将两者都包含在构建中。这意味着当您在 com.google.commons.base 中引用类时使用的类定义将由类路径顺序决定。
Maven classpath ordering is deterministic,所以把你想要使用的库(大概是 Guava)早点放在你的 pom 中,这就是使用的那个。 (要确认这一点,View a dependency tree in Maven?)
将工件与重复类混合通常不是一个好主意。如果可以,请在 Guava 上标准化。
【讨论】: