Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

本文是系列文章《Maven 源码解析:依赖调解是如何实现的?》第六篇,主要介绍 dependencyManagement 版本锁定原则。

请按顺序阅读其他系列文章,系列文章总目录参见:

场景

我们在根模块 mavenDependencyDemo 中,用 dependencyManagement 的形式直接指定 X 的版本为 2.0。同时,A 依赖 C,而 C 依赖了 X(1.0)。我们观察下,最终 A 会依赖 X(1.0)还是 X(2.0)。

根模块 mavenDependencyDemo 的 pom.xml 文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>mavenDependencyDemo</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>
    <modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>X</module>
    </modules>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.example</groupId>
                <artifactId>X</artifactId>
                <version>2.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

A 的 pom.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>mavenDependencyDemo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>A</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
           <artifactId>C</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>
 

使用命令 mvn dependency:tree -Dverbose ,看看依赖树:

[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------< org.example:A >----------------------------
[INFO] Building A 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ A ---
[INFO] org.example:A:jar:1.0
[INFO] \- org.example:C:jar:1.0:compile
[INFO]    \- org.example:X:jar:2.0:compile (version managed from 1.0)
[INFO] ------------------------------------------------------------------------