Почему maven использует более старую версию, когда существует конфликт между дочерними проектами?
В иметь один дочерний модуль testA
который зависит от vaadin-client-compiler, который зависит от commons-lang3 версии 3.1, он также зависит от другого дочернего модуля 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 ответ
Согласно Maven Документация:
[Maven] будет использовать версию ближайшей к вашему проекту зависимости в дереве зависимостей.
а также
если две версии зависимости находятся в одной и той же глубине в дереве зависимостей, до Maven 2.0.8 не было определено, какой из них выиграет, но начиная с Maven 2.0.9 учитывается порядок в объявлении: выигрывает первое объявление.
Таким образом, ответ на ваш вопрос - потому что вы определили vaadin-client-compiler
зависимость до testB
зависимость и зависимость от commons-lang3
такая же глубина в дереве от testA
,
Если вы измените порядок своих зависимостей в testA
вы увидите, что теперь он тянет версию 3.4 commons-lang3
(при условии, что вы используете версию Maven 2.0.9 или новее)