Maven dependencies 与 dependencyManagement 区别

问题如下:

 描述:项目使用的依赖都是父工程的依赖,父工程依赖的spring boot 版本是  2.3.2 . 现在在父工程中引入 2.2.9 的websocket 依赖,发现一直报警告冲突

解决办法:

取消掉websocket 显示的版本号依赖,增加MavenDependency 显示的依赖2.2.9版本

  <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-websocket</artifactId>
                <version>2.2.9.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

分析

虽然问题解决了,依赖包不再报冲突警告,但是究其原因还是不了解。现在分析研究DependencyManagement 为何能够解决这个冲突

在单一的模块中,使用Dependencies 直接依赖,若有一个大工程项目里面包含多个子模块,则为了所有模块包的统一和好管理,则需要用到dependencyManagement 

由于模块很多,所以我们又抽象出一个 parent  来管理子项目的公共依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致。

在顶层的POM 中会用到DependencyManagement ,通过其管理依赖jar 的版本,让子项目中引入一个依赖而不用显示的列出的版本号。Maven 会沿着父层向上走,直到找到dependencyManagement 元素,

然后它会使用在这个DependencyManagement 元素指定的版本号。

如果子类中某个项目想使用特殊的版本号,则直接使用 dependencies 声明即可,不再使用父类的依赖

区别 dependencies dependencyManagement

dependencies 即使在子类项目中不写依赖项,那么字类项目也会从父类项目中继承该依赖项

dependencyManagement 里只是声明依赖项,并不会实现引入,只有在字类项中写了该依赖,并且没有指定版本号,才会从父类中继承 version ,scope .如果字类项使用了指定的版本号,则会使用项目中指定的 jar 版本。

原文地址:https://www.cnblogs.com/bytecodebuffer/p/13710600.html