相关推荐recommended
理解pom.xml中的parent标签
作者:mmseoamin日期:2023-12-21

理解pom.xml中的parent标签,在这里插入图片描述,第1张

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉

🍎个人主页:Leo的博客

💞当前专栏: 循序渐进学SpringBoot

✨特色专栏: MySQL学习

🥭本文内容:理解pom.xml中的parent标签

📚个人知识库: Leo知识库,欢迎大家访问

1.前言☕

大家好,我是Leo哥🫣🫣🫣,今天给大家带来关于精品SpringBoot专栏,暂且就给他起名为循序渐进学SpringBoot,这里我参考了我上一个专栏:循序渐进学SpringSecurity6。有需要的朋友可以抓紧学习来哈,带你从SpringSecurity从零到实战项目。好了,我们进入正题,为什么会有SpringBoot这个专栏呢,是这样的,今年Leo哥也是正在重塑知识体系,从基础到框架,而SpringBoot又是我们框架中的核心,我觉得很有必要通过以博客的形式将我的知识系列进行输出,同时也锻炼一下自己的写作能力,如果能帮到大家那就更好啦!!!本地系列教程会从SpringBoot基础讲起,会以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。好了,话不多说让我们开始吧😎😎😎。

2.回顾

上一篇文章 我们学习了Spring Boot 项目的几种创建方式,这几种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用:


	org.springframework.boot
	spring-boot-starter-parent
	2.3.12.RELEASE
	 

有同学可能要问,Leo哥,这个不就是在Parent中去锁定版本嘛,没啥大不了了的嘛。

确实,但是Parent里面的门道可不止于此,我们这篇文章就一起来探索一下。

3.Parent概述

在Maven项目中的pom.xml文件是这个项目的核心配置文件。parent标签在这个配置文件中有着特殊的作用。简单来说,parent标签是用来指明当前Maven项目继承自哪个父项目的。这里涉及到Maven的继承机制,我们可以从几个方面来理解这个标签的意义和作用:

3.1 继承

在Maven中,通过使用parent标签,可以使得当前项目继承父项目的配置。这里的配置可以是依赖管理、插件配置、属性等。例如,如果很多模块都需要用到同样的版本管理或者构建配置,可以通过一个公共的父项目来管理这些共享配置,子项目通过指定父项目来继承这些配置。

3.2 聚合和继承的区别

在Maven中,有两种常见的多模块的项目结构 - 聚合(Aggregation)和继承(Inheritance)。parent标签通常是继承的体现。如果一个项目只是简单地聚合其他模块,不一定用到parent标签;它会用modules标签列出所有子模块。但是,当这些模块需要共享配置时,通常会有一个父项目,各个子项目通过parent标签来指定这个父项目,从而实现配置的继承。

3.3 parent标签的内容

parent标签通常包含以下几个主要元素:

  • groupId: 父项目的group ID。
  • artifactId: 父项目的artifact ID。
  • version: 父项目的版本号。
  • relativePath: 父POM的相对路径。如果不指定,默认查找../pom.xml。

    例如:

    
      com.example
      example-parent
      1.0.0
    
    

    这段代码表示当前项目的父项目有groupId为com.example,artifactId为example-parent,版本为1.0.0。

    3.4 版本管理

    在父项目中定义的部分可以设定依赖的版本,这样子模块只需声明要使用的依赖,而不需要每个子模块单独指定版本号,这大大方便了版本管理。

    3.5 插件管理

    父项目同样可以定义来设定插件的版本和配置,子项目也可以继承父项目中的插件配置。

    4.Parent的作用

    使用 Maven 是为了更好的帮项目管理包依赖,Maven 的核心就是pom.xml。当我们需要引入一个jar包时,在pom文件中加上就可以从仓库中依赖到相应的jar包。

    现在有这样一个场景,有两个web项目A、B,一个java项目C,它们都需要用到同一个jar包:example.jar。如果分别在三个项目的pom文件中定义各自对example.jar的依赖,那么当example.jar的版本发生变化时,三个项目的pom文件都要改,项目越多要改的地方就越多,很麻烦。这时候就需要用到parent标签, 我们创建一个parent项目,打包类型为pom,parent项目中不存放任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对example.jar的依赖,ABC三个子项目中只需要定义,parent标签中写上parent项目的pom坐标就可以引用到example.jar了。

    5.Parent的功能

    当我们创建一个SpringBoot项目的时候,可以继承自一个 spring-boot-starter-parent ,也可以不继承自它。那么他到底有哪些功能呢

    1. 定义了 Java 编译版本为 1.8 。
    2. 使用 UTF-8 格式编码。
    3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
    4. 执行打包操作的配置。
    5. 自动化的资源过滤。
    6. 自动化的插件配置。
    7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

    我们下面来看一个实例:

    
    
        4.0.0
        org.javatop
        Leo-springboot-tutorial
        1.0-SNAPSHOT
        pom
        
            springboot-init
            springboot-demo
        
        
            8
            8
            UTF-8
            2.3.12.RELEASE
        
        
            
                
                    org.springframework.boot
                    spring-boot-dependencies
                    ${revision}
                    pom
                    import
                
                
                
                    org.springframework.boot
                    spring-boot-starter-web
                    ${revision}
                
                
                
                    org.springframework.boot
                    spring-boot-starter-test
                    ${revision}
                    test
                
            
        
    
    

    这里是我们上一篇创建SpringBoot项目对应的POM文件。

    理解pom.xml中的parent标签,image-20231220185004957,第2张

    可以看出来,我们并没有直接去继承 spring-boot-starter-parent,而是通过dependencyMangement,然后再properties标签中去锁定他的版本。

    理解pom.xml中的parent标签,image-20231220185043276,第3张

    这样的话,以后我们创建的子项目一旦继承了我们父项目,我们就不需要再去考虑各种版本问题了,所有的版本信息只需要在父项目的dependencyMangement进行锁定即可。

    理解pom.xml中的parent标签,image-20231220185333721,第4张

    6.Parent源码

    我们创建SpringBoot项目之后,我们可以在本地 Maven 仓库中看到看到这个具体的 parent 文件。

    笔者这里的路径是:D:\software\maven-repository\org\springframework\boot\spring-boot-dependencies\2.3.12.RELEASE,大家可以按需查找。

    当然也可以通过我们POM中的代码点击过去。

    理解pom.xml中的parent标签,image-20231220185700852,第5张

    就能看到以下源码了。

    理解pom.xml中的parent标签,image-20231220185725610,第6张

    我们可以看到,它继承自 spring-boot-dependencies ,这里保存了基本的依赖信息,另外我们也可以看到项目的编码格式,JDK 的版本等信息,当然也有我们前面提到的数据过滤信息。最后,我们再根据它的 parent 中指定的 spring-boot-dependencies 位置,来看看 spring-boot-dependencies 中的定义:

    
        5.15.15
        2.7.7
        1.9.89
        2.12.0
        1.9.6
        3.16.1
        4.0.6
        4.0.3
        2.1.4
        3.1.0
        1.10.22
        2.8.8
        4.6.1
        1.5.1
        1.14
        2.7.0
        3.10
        1.6
        2.8.1
        3.0.10
        11.5.5.0
        1.0.11.RELEASE
        10.14.2.0
        4.1.22
        2.10.9.2
        3.8.1
        7.6.2
        2.2.0
        1.6.0
        1.2.7
        6.4.4
        2.3.31
        3.0.1
        3.0.3
        2.3.4
        2.5.14
        2.8.7
        1.4.200
        2.2
        3.12.12
        1.3.2
        5.4.32.Final
        6.1.7.Final
        3.4.5
        2.5.2
        2.40.0
        4.1.4
        4.5.13
        4.4.14
        10.1.8.Final
        2.18
        2.11.4
        1.2.2
        1.3.5
        2.0.3
        1.1.6
        1.0.2
        1.6.7
        2.2.3
        4.0.4
        1.2.7
        1.3.3
        2.0.2
        1.1.2
        2.1.6
        2.3.3
        1.4.2
        2.3.3
        3.1.4
        1.2.0
        1.3.2
        1.1.1
        2.3.1
        2.3.1
        2.0.1
        1.1.4
        1.0
        1.6.2
        1.0.3
        2.2
        1.3
        2.0.1.Final
        1.1
        1.2.0
        3.0.11
        3.4.2.Final
        7.6.1.Final
        2.0.6
        3.3.0
        2.30.1
        8.5.54
        2.2.0.v201112011158
        1.1.9
        9.4.42.v20210604
        1.15
        1.2.13
        1.6.2
        3.13.6
        2.4.0
        2.3.1
        1.5.0
        1.2
        1.3.1
        4.13.2
        5.6.3
        2.5.1
        1.3.72
        1.3.8
        5.3.7.RELEASE
        3.8.9
        2.13.3
        1.2.3
        1.18.20
        2.6.2
        1.8
        3.3.0
        3.1.0
        3.8.1
        3.1.2
        2.8.2
        3.0.0-M3
        2.22.2
        3.2.0
        2.5.2
        3.2.2
        3.2.0
        3.2.0
        3.1.0
        3.2.4
        3.2.1
        2.22.2
        3.2.3
        1.5.14
        1.9.14
        3.3.3
        4.0.6
        7.4.1.jre8
        8.0.25
        1.9.22
        3.2.24
        4.1.65.Final
        2.0.39.Final
        1.1.0
        7.1.3
        8.19
        19.3.0.0
        3.14.9
        19.3.0.0
        1.1.2
        42.2.20
        0.9.0
        2.3.2
        4.3.1
        Arabba-SR10
        5.9.0
        1.0.3
        Dysprosium-SR20
        3.3.0
        1.0.5
        1.3.8
        1.2.1
        2.2.21
        1.5.3
        3.141.59
        2.40.0
        4.4.8
        4.0.1
        1.7.30
        1.26
        8.5.2
        2.2.18.RELEASE
        4.2.7.RELEASE
        Neumann-SR9
        5.2.15.RELEASE
        1.1.5.RELEASE
        5.3.8.RELEASE
        2.5.14.RELEASE
        2.3.4.RELEASE
        2.0.5.RELEASE
        1.2.5.RELEASE
        5.3.9.RELEASE
        Dragonfruit-SR3
        3.0.10.RELEASE
        3.31.1
        1.6.7
        3.0.12.RELEASE
        2.0.1
        3.0.4.RELEASE
        3.0.4.RELEASE
        2.4.1
        9.0.46
        4.0.14
        2.1.7.Final
        2.7
        3325375
        0.45
        1.6.3
        1.0.2
        2.7.0
      
    

    这就是我们为什么可以在dependencyManagement可以直接锁定版本的原因了。

    7.文末推荐🍭

    如果你是刚学完SSM框架,如果你想学系统的学习SpringBoot,如果你想使用SpringBoot去集成各种其他组件,那么我这份循序渐进学SpringBoot一定是首选,带你从零到深入学习SpringBoot。抓紧订阅起来吧。用知识点+案例+项目解读的学习模式由浅入深对Spring Boot框架进行学习&使用。

    理解pom.xml中的parent标签,公众号封面,第7张