经常使用maven的同学一定会对<dependencies>和<dependencyManagement>这两个标签很熟悉,没有很在意两者的区别,现记录一下2者区别。
dependencyManagement的使用场景
随着微服务的火爆,导致了我们现在的项目由多个微服务模块组成,列如一个电商的项目会被分割成诸如:订单微服务,库存微服务,商品微服务等模块,为了保证项目中的各个模块所使用的包保持一致性,我们需要在最顶层(父项目)中进行版本号的锁定。假如我们使用的springboot的版本为2.X,那么我们我们的springcloud版本也就随之确定为Finchley版本。换言之,我们所有的子微服务必须使用相同的springcloud版本,这个时候dependencyManagement的作用就体现出了,只需要在顶层项目中加入
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这段代码后,假如订单模块使用springcloud时,只需要引入如下代码,无须再引用版本号等信息,因为springcloud版本号已被锁定
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaserver</
artifactId>
</dependency>
</dependencies>
dependencies的使用场景
如果顶层模块引入到一个jar,那么所有他的子模块都会继承这个jar包。
dependencies和dependencyManagement的区别
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。