无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM
,这个父 POM 被称为 Super POM
。在pom的继承关系中,子pom可以覆盖父pom中的配置
;如果子pom没有覆盖,那么父pom中的配置将会被继承
。按照这个规则,继承关系中的所有pom叠加到一起,就生成一个最终生效的pom
。maven实际运行的过程中,执行构建操作就是按照这个最终的pom
运行起来的。最终的pom也叫作有效pom翻译为effective POM
,通过mvn help:effective-pom
命令就可以查看项目的最终生成的pom(有效的pom)。
注意:假如项目当中引用了一个A的依赖,而A又引用了其他的依赖,通过
mvn help:effective-pom
查出来的pom并不会展示出来A引用的其他依赖(不展示并不代表不可以使用,具体是否可以使用要根据依赖的scope来决定的)。只会展示出来当前项目<parent>
所继承的依赖!可能他所继承的pom当中仍然继承了别的,会将所有层级汇集起来展示出来的!
下面进行示例演示,通过示例便可以一目了然:
项目是一个聚合项目,如下是父工程的pom.xml
在idea当中创建springboot项目的时候都会引用一个spring-boot-starter-parent作为父类,实际上没有他我们项目就不能使用了吗?当然不是,我们可以点进去看一下他都做了些什么,实际上就是给我们提供了一个管理的依赖pom。
新建一个空项目,只引入web(注意没有引入boot版本管理,那就需要手动添加版本号),springboot照样可以启动的哟
这是一个common包,主要存放公共的一些配置
这是一个web工程
这时候我们对web工程进行使用mvn help:effective-pom
命令,看看他究竟执行的时候有哪些依赖。
他会把所有父 POM汇集到一起生成一个pom,lombok我是在父类当中引用的,可以发现最终pom当中他会继承过来的。
现在有个问题,我现在想使用spring-boot-starter-parent提供的依赖管理,但是我又不想继承他,因为我还要继承别的项目,这时候该怎么办呢?
maven和Java一样都是单继承机制,maven当中有
<type>pom</type>和<scope>import</scope>
,通过这两个标签在dependencyManagement中声明依赖,可以替代继承(达到类似parent标签的作用,解决了单继承问题)。
官网讲解:https://docs.spring.io/spring-boot/docs/3.1.0-SNAPSHOT/maven-plugin/reference/htmlsingle/#using.import
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
类似于
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/>
</parent>
注意:这里只是类似,并不完全替代继承。
以如下示例来来看:这里的dependencies是plugin里面嵌套的dependencies。
说明使用dependencyManagement来替代parent的时候,plugin里面嵌套的dependencies版本并没有继承过来。除此之外其他都和继承是一样的。他会继承dependencyManagement当中的版本管理,而且还会继承dependencies当中引用的依赖。