对于聚合工程的微服务,pom的依赖是一个非常有特色的地方
用法一:
首先对于父工程:
当一个父pom中的dependencyManagement 标签中需要导入另一个pom中的dependencyManagement的时候,必须同时使用<scope>import</scope>
和 <type>pom</type>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这个时候,该pom中dependencyManagement就会包含导入的spring-boot-dependencies中的所有dependencyManagement
这是为了解决pom类型的父工程单继承的问题,通过导入,可以导入各种其他父工程的dependencyManagement
注意:dependencyManagement只在父工程(即pom类型的maven工程)中声明,在子工程中定义无需声明版本从而生效。如果在jar类型的maven工程中添加了dependencyManagement,是没有意义的。
好处:当我们需要引入很多 jar 包的时候,会导致 pom.xml 过大,如使用 CXF 时,项目中可能要引入如下很多依赖包,此时,依赖包很多,导致 pom.xml 文件较大。我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的 pom.xml 文件过大。这个时候我们引进来一个 type 为 pom,意味着我们可以将所有的 jar 包打包成一个 pom,然后我们依赖了 pom,即可以下载下来所有依赖的 jar 包。
用法二:
说明:当需要把一些依赖定义到一个pom工程中,但是由于maven单继承机制,子工程又想通过依赖引入该pom工程中的所有依赖,只需要添加<type>pom</type>
如下:
<dependencies>
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<type>pom</type>
</dependency>
</dependencies>
这是为了解决子工程单继承的问题,通过<type>pom</type>
可以依赖于其他的pom父工程,从而将pom工程中的依赖都传递过来
type 默认是jar,依赖jar工程时可以不写type标签,所以如果依赖于一个jar工程,而jar工程中包含大量的依赖,也会一起传递过来,这也就是maven依赖传递的原理。
综上:
这样做的好处是:
1.统一管理一个最初的版本,不需要到处定义
2.子model引入依赖只需要指定groupId、artifactId即可(版本号继承父类)
3.只会定义一个统一的初始的版本,但是不会真的引入依赖,子model不会继承parent中dependencyManagement所有预定义的depandency
那么问题来了,为了便于管理那么在父工程内dependencyManagement中添加了多个依赖,这对于子model来说就是多个父model(也可以理解为多个<parent></parent>
标签),而maven的继承和java的继承规范化是一致的,
那么如何处理让子model可以多继承父model,答案就是在每个依赖中添加<type>pom</type>
和<scope>import</scope>
<type> </type>
里的值默认值是jar表示引入的是jar包,这里使用的是pom表示导入的是父模块
中的值import代表把父模块中的jar包导入进来,不过需要注意的是import,这种方式只能用在<dependencyManagement>
和</dependencyManagement>
中。