Java小强个人技术博客站点    手机版
当前位置: 首页 >> 开源 >> Maven中的dependencyManagement

Maven中的dependencyManagement

29420 开源 | 2021-1-17

在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。


pom.xml文件中,jar的版本判断的两种途径:

1)如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version

2)如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准


父项目使用时原则

1)dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)。dependencyManagement是声明而不引入依赖,因此子项目需要显式的声明需要用的依赖(不需要版本号)。子项目中引用一个依赖而无版本号时,会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,使用其版本号。

2)dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

//只是对版本进行管理,不会实际引入jar 
<dependencyManagement> 
      <dependencies> 
            <dependency> 
                <groupId>org.springframework</groupId> 
                <artifactId>spring-core</artifactId> 
                <version>3.2.7</version> 
            </dependency> 
    </dependencies> 
</dependencyManagement> 
   
//会实际下载jar包 
<dependencies> 
       <dependency> 
                <groupId>org.springframework</groupId> 
                <artifactId>spring-core</artifactId> 
       </dependency> 
</dependencies>


那么多个不同版本的依赖maven怎样做出取舍

比如A依赖B,B依赖C,C依赖D(1.0);A依赖X,X依赖D(2.0)。那么A最终依赖的是D(1.0)还是D(2.0)呢?针对这类问题,maven有个专门的处理方式:依赖调解。

依赖调解有两条原则:

第一条,路径最近者优先。比如一开始提的问题,因为相对于D(2.0),D(1.0)在依赖树上距离A更远,所以最终maven选择引入的依赖是D(2.0)。那么如果两个不同版本的依赖在依赖树上的距离A同样远,又该怎么办呢?这里就引入了依赖调解的第二条原则,第一声明者优先。就比如A依赖B,B依赖D(1.0);A依赖X,X依赖D(2.0)。那么如果在A中,依赖B声明在依赖X之前,则会引入D(1.0),反之则会引入D(2.0)。

以上是依赖传递,如果直接定义了引入D(2.0),那么将直接引入该包,直接依赖大于传递依赖


maven.jpg

推荐您阅读更多有关于“ maven dependency dependencyManagement ”的文章

上一篇:deepin修改ROOT密码 下一篇:配置Maven

猜你喜欢

发表评论: