有一个子模块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>
答案 0 :(得分:3)
[Maven]将在依赖树中使用与项目最接近的依赖项版本。
和
如果两个依赖版本在依赖关系树中处于相同的深度,直到Maven 2.0.8没有定义哪一个会赢,但是从Maven 2.0.9开始,它就是声明中的顺序:第一个声明获胜
所以问题的答案是 - 因为你在vaadin-client-compiler
依赖项之前定义了testB
依赖项,而commons-lang3
对testA
的依赖与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版本或者较新的)