Maven传递依赖打破了构建

时间:2012-12-20 15:07:45

标签: java maven build

我有一个以下问题 - 我正在尝试在我的项目中使用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

所以我可以看到问题,但我真的不知道如何修复它。感谢您的任何建议: - )

3 个答案:

答案 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中声明版本,所以就是这样。谢谢你的建议!