我有一个以下问题 - 我正在尝试在我的项目中使用apache commons-lang version 2.6
(在pom.xml中定义)但由于传递依赖性maven总是添加版本3.2.1,这会破坏我的构建。
这是pom.xml的相关部分
<properties>
<commons-lang.version>2.6</commons-lang.version>
</properties>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
当我尝试运行mvn dependency:tree
时,我可以看到原因是
+- org.seleniumhq.selenium:selenium-api:jar:2.26.0:compile (version managed from 2.26.0)
+- net.sourceforge.htmlunit:htmlunit:jar:2.10:compile
+- org.apache.commons:commons-lang3:jar:3.1:compile
所以我可以看到问题,但我真的不知道如何修复它。感谢您的任何建议: - )
答案 0 :(得分:4)
查看在导致问题的依赖项中使用排除标记。排除标记告诉maven你不希望maven引入间接依赖,并且在这种情况下使用。
例如,如果我的一个依赖项A引入了B的1.0版本但我想使用B的2.0版本,我可以这样做:
<dependency>
<groupId>org.mycorp</groupId>
<artifactID>A</artifactID>
<version>4.0</version>
<exclusions>
<exclusion>
<groupId>org.mycorp</groupId>
<artifactId>B</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mycorp</groupId>
<artifactID>B</artifactID>
<version>2.0</version>
</dependency>
排除标记表示在这种情况下不引入间接依赖(B 1.0)。请注意,您不必提供该版本。一旦你告诉maven不要自动引入那个版本的B,你就会遵循一个明确的依赖关系来定义你想要的B版本(在这种情况下是2.0版本)。
答案 1 :(得分:3)
这个特殊的依赖应该不打破你的构建,因为Commons Lang 3使用与Lang 2不同的包命名。你的代码应该使用来自Lang2的类,而HTMLUnit将使用来自Lang3的类,并且两个JAR都可以共存。
也许您应该使用构建输出中的相关摘录来描述 您认为这会如何破坏您的构建。
答案 2 :(得分:0)
我的同事忘了在父pom中的dependencyManagement中声明版本,所以就是这样。谢谢你的建议!