【记录maven依赖规则-dependencyManagement,dependencies】

记录maven依赖规则-dependencyManagement,dependencies

依赖方式

直接依赖
间接依赖

依赖关系

直接依赖:
父级管理定义的版本,并且在中进行引用了的版本。
优先使用dependencyManagement定义的版本。

间接依赖:
如果间接依赖没有指定版本,Maven 会先查看 dependencyManagement 里是否有定义。若有,就使用定义的版本;若没有,Maven 会按照自身的依赖解析规则(如路径最短原则)来确定版本。

当你自己项目的 dependencyManagement 和 Spring 的 dependencyManagement 都定义了同一个依赖的版本,且项目的 dependencies 中没有显式引入该依赖(仅通过间接依赖引入)时,Maven 确定最终使用版本的规则如下:

1. 自身项目优先原则

Maven 会优先遵循自身项目 dependencyManagement 里定义的版本。这是因为 Maven 认为项目自身的配置优先级高于外部框架(如 Spring)的配置。所以,若你在自己项目的 dependencyManagement 中定义了某个依赖的版本,那么当该依赖以间接方式被引入时,Maven 会优先使用你所定义的版本。

示例

假设你的项目结构如下:

父 POM(自己项目的父 POM)

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.some-library</groupId>
                <artifactId>some-library</artifactId>
                <version>2.0.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

子项目 POM

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>child-project</artifactId>
    <version>1.0.0</version>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>

    <!-- 假设引入了一个依赖,该依赖间接依赖 com.some-library -->
    <dependencies>
        <dependency>
            <groupId>com.dependency</groupId>
            <artifactId>dependency-project</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

Spring 的 dependencyManagement 定义(简化示意)

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.some-library</groupId>
            <artifactId>some-library</artifactId>
            <version>1.5.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在这种情况下,由于你自己项目的 dependencyManagement 定义了 com.some-library 的版本为 2.0.0,所以当 dependency-project 间接引入 com.some-library 时,Maven 会使用 2.0.0 版本。

2. 若自身项目未定义

要是你自己项目的 dependencyManagement 中没有定义该依赖的版本,Maven 才会去参考 Spring 的 dependencyManagement 里定义的版本。若 Spring 也未定义,Maven 就会按照依赖树的路径最短原则等自身的依赖解析规则来确定版本。

总结而言,Maven 会优先采用你自己项目 dependencyManagement 中定义的依赖版本,以保证项目对依赖版本有最大的控制权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值