当子项目之间存在冲突时,为什么maven会使用旧版本?

时间:2018-05-02 00:08:17

标签: java maven maven-reactor

有一个子模块testA依赖于依赖于commons-lang3 3.1版的vaadin-client-compiler,它还依赖于另一个子模块testB,它取决于commons-lang3版本3.4。

我希望testA使用3.4版本,因为testB取决于它,但它使用3.1版本。我可以通过将[]添加到testB项目中的版本来解决此问题,但为什么会发生?为什么maven没有被强制解析不正确的版本?

MCVE:

父:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test</name>
    <packaging>pom</packaging>
    <modules>
        <module>testB</module>
        <module>testA</module>
    </modules>
</project>

依赖的孩子

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
    <dependencies>
        <dependency>
            <groupId>com.vaadin</groupId>
            <version>7.6.8</version>
            <artifactId>vaadin-client-compiler</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
  <groupId>testB</groupId>
  <artifactId>testB</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
  <groupId>testA</groupId>
  <artifactId>testA</artifactId>
</project>

和受抚养的孩子

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>testB</groupId>
  <artifactId>testB</artifactId>
  <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
  </dependencies>
</project>

1 个答案:

答案 0 :(得分:3)

根据Maven Documentation

  

[Maven]将在依赖树中使用与项目最接近的依赖项版本。

  

如果两个依赖版本在依赖关系树中处于相同的深度,直到Maven 2.0.8没有定义哪一个会赢,但是从Maven 2.0.9开始,它就是声明中的顺序:第一个声明获胜

所以问题的答案是 - 因为你在vaadin-client-compiler依赖项之前定义了testB依赖项,而commons-lang3testA的依赖与testA树中的深度相同}。

如果你在commons-lang3中颠倒了依赖关系的顺序,你会发现它现在拉出<label attr1 attr2="test"> -> test <label attr1 attr2='test'> -> test <label attr2="test" attr1> -> test <label attr2='test' attr1> -> test <label attr1 attr2="test"> -> test <label attr1 attr2='test'> -> test <label attr2="test" attr1> -> test <label attr2='test' attr1> -> test <label attr2='test'> -> Not match <label attr2="test"> -> Not match 的3.4版本(假设你使用的是2.0版的Maven版本或者较新的)