✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人
个人主页:Leo的博客
当前专栏: 循序渐进学SpringBoot
✨特色专栏: MySQL学习
本文内容:理解pom.xml中的parent标签
个人知识库: Leo知识库,欢迎大家访问
大家好,我是Leo哥,今天给大家带来关于精品SpringBoot专栏,暂且就给他起名为循序渐进学SpringBoot,这里我参考了我上一个专栏:循序渐进学SpringSecurity6。有需要的朋友可以抓紧学习来哈,带你从SpringSecurity从零到实战项目。好了,我们进入正题,为什么会有SpringBoot这个专栏呢,是这样的,今年Leo哥也是正在重塑知识体系,从基础到框架,而SpringBoot又是我们框架中的核心,我觉得很有必要通过以博客的形式将我的知识系列进行输出,同时也锻炼一下自己的写作能力,如果能帮到大家那就更好啦!!!本地系列教程会从SpringBoot基础讲起,会以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。好了,话不多说让我们开始吧。
上一篇文章 我们学习了Spring Boot 项目的几种创建方式,这几种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.12.RELEASEversion>
<relativePath/>
parent>
有同学可能要问,Leo哥,这个不就是在Parent中去锁定版本嘛,没啥大不了了的嘛。
确实,但是Parent里面的门道可不止于此,我们这篇文章就一起来探索一下。
在Maven项目中的pom.xml
文件是这个项目的核心配置文件。parent
标签在这个配置文件中有着特殊的作用。简单来说,parent
标签是用来指明当前Maven项目继承自哪个父项目的。这里涉及到Maven的继承机制,我们可以从几个方面来理解这个标签的意义和作用:
在Maven中,通过使用parent
标签,可以使得当前项目继承父项目的配置。这里的配置可以是依赖管理、插件配置、属性等。例如,如果很多模块都需要用到同样的版本管理或者构建配置,可以通过一个公共的父项目来管理这些共享配置,子项目通过指定父项目来继承这些配置。
在Maven中,有两种常见的多模块的项目结构 - 聚合(Aggregation)和继承(Inheritance)。parent
标签通常是继承的体现。如果一个项目只是简单地聚合其他模块,不一定用到parent
标签;它会用modules
标签列出所有子模块。但是,当这些模块需要共享配置时,通常会有一个父项目,各个子项目通过parent
标签来指定这个父项目,从而实现配置的继承。
parent
标签通常包含以下几个主要元素:
groupId
: 父项目的group ID。artifactId
: 父项目的artifact ID。version
: 父项目的版本号。relativePath
: 父POM的相对路径。如果不指定,默认查找../pom.xml
。例如:
<parent>
<groupId>com.examplegroupId>
<artifactId>example-parentartifactId>
<version>1.0.0version>
parent>
这段代码表示当前项目的父项目有groupId
为com.example
,artifactId
为example-parent
,版本为1.0.0
。
在父项目中定义的
部分可以设定依赖的版本,这样子模块只需声明要使用的依赖,而不需要每个子模块单独指定版本号,这大大方便了版本管理。
父项目同样可以定义
来设定插件的版本和配置,子项目也可以继承父项目中的插件配置。
使用 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
了。
当我们创建一个SpringBoot项目的时候,可以继承自一个 spring-boot-starter-parent
,也可以不继承自它。那么他到底有哪些功能呢
spring-boot-dependencies
,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。我们下面来看一个实例:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.javatopgroupId>
<artifactId>Leo-springboot-tutorialartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<modules>
<module>springboot-initmodule>
<module>springboot-demomodule>
modules>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<revision>2.3.12.RELEASErevision>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${revision}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>${revision}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>${revision}version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
project>
这里是我们上一篇创建SpringBoot项目对应的POM文件。
可以看出来,我们并没有直接去继承 spring-boot-starter-parent
,而是通过dependencyMangement,然后再properties标签中去锁定他的版本。
这样的话,以后我们创建的子项目一旦继承了我们父项目,我们就不需要再去考虑各种版本问题了,所有的版本信息只需要在父项目的dependencyMangement进行锁定即可。
我们创建SpringBoot项目之后,我们可以在本地 Maven 仓库中看到看到这个具体的 parent 文件。
笔者这里的路径是:D:\software\maven-repository\org\springframework\boot\spring-boot-dependencies\2.3.12.RELEASE
,大家可以按需查找。
当然也可以通过我们POM中的代码点击过去。
就能看到以下源码了。
我们可以看到,它继承自 spring-boot-dependencies
,这里保存了基本的依赖信息,另外我们也可以看到项目的编码格式,JDK 的版本等信息,当然也有我们前面提到的数据过滤信息。最后,我们再根据它的 parent 中指定的 spring-boot-dependencies
位置,来看看 spring-boot-dependencies
中的定义:
<properties>
<activemq.version>5.15.15activemq.version>
<antlr2.version>2.7.7antlr2.version>
<appengine-sdk.version>1.9.89appengine-sdk.version>
<artemis.version>2.12.0artemis.version>
<aspectj.version>1.9.6aspectj.version>
<assertj.version>3.16.1assertj.version>
<atomikos.version>4.0.6atomikos.version>
<awaitility.version>4.0.3awaitility.version>
<bitronix.version>2.1.4bitronix.version>
<build-helper-maven-plugin.version>3.1.0build-helper-maven-plugin.version>
<byte-buddy.version>1.10.22byte-buddy.version>
<caffeine.version>2.8.8caffeine.version>
<cassandra-driver.version>4.6.1cassandra-driver.version>
<classmate.version>1.5.1classmate.version>
<commons-codec.version>1.14commons-codec.version>
<commons-dbcp2.version>2.7.0commons-dbcp2.version>
<commons-lang3.version>3.10commons-lang3.version>
<commons-pool.version>1.6commons-pool.version>
<commons-pool2.version>2.8.1commons-pool2.version>
<couchbase-client.version>3.0.10couchbase-client.version>
<db2-jdbc.version>11.5.5.0db2-jdbc.version>
<dependency-management-plugin.version>1.0.11.RELEASEdependency-management-plugin.version>
<derby.version>10.14.2.0derby.version>
<dropwizard-metrics.version>4.1.22dropwizard-metrics.version>
<ehcache.version>2.10.9.2ehcache.version>
<ehcache3.version>3.8.1ehcache3.version>
<elasticsearch.version>7.6.2elasticsearch.version>
<embedded-mongo.version>2.2.0embedded-mongo.version>
<exec-maven-plugin.version>1.6.0exec-maven-plugin.version>
<flatten-maven-plugin.version>1.2.7flatten-maven-plugin.version>
<flyway.version>6.4.4flyway.version>
<freemarker.version>2.3.31freemarker.version>
<git-commit-id-plugin.version>3.0.1git-commit-id-plugin.version>
<glassfish-el.version>3.0.3glassfish-el.version>
<glassfish-jaxb.version>2.3.4glassfish-jaxb.version>
<groovy.version>2.5.14groovy.version>
<gson.version>2.8.7gson.version>
<h2.version>1.4.200h2.version>
<hamcrest.version>2.2hamcrest.version>
<hazelcast.version>3.12.12hazelcast.version>
<hazelcast-hibernate5.version>1.3.2hazelcast-hibernate5.version>
<hibernate.version>5.4.32.Finalhibernate.version>
<hibernate-validator.version>6.1.7.Finalhibernate-validator.version>
<hikaricp.version>3.4.5hikaricp.version>
<hsqldb.version>2.5.2hsqldb.version>
<htmlunit.version>2.40.0htmlunit.version>
<httpasyncclient.version>4.1.4httpasyncclient.version>
<httpclient.version>4.5.13httpclient.version>
<httpcore.version>4.4.14httpcore.version>
<infinispan.version>10.1.8.Finalinfinispan.version>
<influxdb-java.version>2.18influxdb-java.version>
<jackson-bom.version>2.11.4jackson-bom.version>
<jakarta-activation.version>1.2.2jakarta-activation.version>
<jakarta-annotation.version>1.3.5jakarta-annotation.version>
<jakarta-jms.version>2.0.3jakarta-jms.version>
<jakarta-json.version>1.1.6jakarta-json.version>
<jakarta-json-bind.version>1.0.2jakarta-json-bind.version>
<jakarta-mail.version>1.6.7jakarta-mail.version>
<jakarta-persistence.version>2.2.3jakarta-persistence.version>
<jakarta-servlet.version>4.0.4jakarta-servlet.version>
<jakarta-servlet-jsp-jstl.version>1.2.7jakarta-servlet-jsp-jstl.version>
<jakarta-transaction.version>1.3.3jakarta-transaction.version>
<jakarta-validation.version>2.0.2jakarta-validation.version>
<jakarta-websocket.version>1.1.2jakarta-websocket.version>
<jakarta-ws-rs.version>2.1.6jakarta-ws-rs.version>
<jakarta-xml-bind.version>2.3.3jakarta-xml-bind.version>
<jakarta-xml-soap.version>1.4.2jakarta-xml-soap.version>
<jakarta-xml-ws.version>2.3.3jakarta-xml-ws.version>
<janino.version>3.1.4janino.version>
<javax-activation.version>1.2.0javax-activation.version>
<javax-annotation.version>1.3.2javax-annotation.version>
<javax-cache.version>1.1.1javax-cache.version>
<javax-jaxb.version>2.3.1javax-jaxb.version>
<javax-jaxws.version>2.3.1javax-jaxws.version>
<javax-jms.version>2.0.1javax-jms.version>
<javax-json.version>1.1.4javax-json.version>
<javax-jsonb.version>1.0javax-jsonb.version>
<javax-mail.version>1.6.2javax-mail.version>
<javax-money.version>1.0.3javax-money.version>
<javax-persistence.version>2.2javax-persistence.version>
<javax-transaction.version>1.3javax-transaction.version>
<javax-validation.version>2.0.1.Finaljavax-validation.version>
<javax-websocket.version>1.1javax-websocket.version>
<jaxen.version>1.2.0jaxen.version>
<jaybird.version>3.0.11jaybird.version>
<jboss-logging.version>3.4.2.Finaljboss-logging.version>
<jboss-transaction-spi.version>7.6.1.Finaljboss-transaction-spi.version>
<jdom2.version>2.0.6jdom2.version>
<jedis.version>3.3.0jedis.version>
<jersey.version>2.30.1jersey.version>
<jetty-el.version>8.5.54jetty-el.version>
<jetty-jsp.version>2.2.0.v201112011158jetty-jsp.version>
<jetty-reactive-httpclient.version>1.1.9jetty-reactive-httpclient.version>
<jetty.version>9.4.42.v20210604jetty.version>
<jmustache.version>1.15jmustache.version>
<johnzon.version>1.2.13johnzon.version>
<jolokia.version>1.6.2jolokia.version>
<jooq.version>3.13.6jooq.version>
<json-path.version>2.4.0json-path.version>
<json-smart.version>2.3.1json-smart.version>
<jsonassert.version>1.5.0jsonassert.version>
<jstl.version>1.2jstl.version>
<jtds.version>1.3.1jtds.version>
<junit.version>4.13.2junit.version>
<junit-jupiter.version>5.6.3junit-jupiter.version>
<kafka.version>2.5.1kafka.version>
<kotlin.version>1.3.72kotlin.version>
<kotlin-coroutines.version>1.3.8kotlin-coroutines.version>
<lettuce.version>5.3.7.RELEASElettuce.version>
<liquibase.version>3.8.9liquibase.version>
<log4j2.version>2.13.3log4j2.version>
<logback.version>1.2.3logback.version>
<lombok.version>1.18.20lombok.version>
<mariadb.version>2.6.2mariadb.version>
<maven-antrun-plugin.version>1.8maven-antrun-plugin.version>
<maven-assembly-plugin.version>3.3.0maven-assembly-plugin.version>
<maven-clean-plugin.version>3.1.0maven-clean-plugin.version>
<maven-compiler-plugin.version>3.8.1maven-compiler-plugin.version>
<maven-dependency-plugin.version>3.1.2maven-dependency-plugin.version>
<maven-deploy-plugin.version>2.8.2maven-deploy-plugin.version>
<maven-enforcer-plugin.version>3.0.0-M3maven-enforcer-plugin.version>
<maven-failsafe-plugin.version>2.22.2maven-failsafe-plugin.version>
<maven-help-plugin.version>3.2.0maven-help-plugin.version>
<maven-install-plugin.version>2.5.2maven-install-plugin.version>
<maven-invoker-plugin.version>3.2.2maven-invoker-plugin.version>
<maven-jar-plugin.version>3.2.0maven-jar-plugin.version>
<maven-javadoc-plugin.version>3.2.0maven-javadoc-plugin.version>
<maven-resources-plugin.version>3.1.0maven-resources-plugin.version>
<maven-shade-plugin.version>3.2.4maven-shade-plugin.version>
<maven-source-plugin.version>3.2.1maven-source-plugin.version>
<maven-surefire-plugin.version>2.22.2maven-surefire-plugin.version>
<maven-war-plugin.version>3.2.3maven-war-plugin.version>
<micrometer.version>1.5.14micrometer.version>
<mimepull.version>1.9.14mimepull.version>
<mockito.version>3.3.3mockito.version>
<mongodb.version>4.0.6mongodb.version>
<mssql-jdbc.version>7.4.1.jre8mssql-jdbc.version>
<mysql.version>8.0.25mysql.version>
<nekohtml.version>1.9.22nekohtml.version>
<neo4j-ogm.version>3.2.24neo4j-ogm.version>
<netty.version>4.1.65.Finalnetty.version>
<netty-tcnative.version>2.0.39.Finalnetty-tcnative.version>
<nio-multipart-parser.version>1.1.0nio-multipart-parser.version>
<oauth2-oidc-sdk.version>7.1.3oauth2-oidc-sdk.version>
<nimbus-jose-jwt.version>8.19nimbus-jose-jwt.version>
<ojdbc.version>19.3.0.0ojdbc.version>
<okhttp3.version>3.14.9okhttp3.version>
<oracle-database.version>19.3.0.0oracle-database.version>
<pooled-jms.version>1.1.2pooled-jms.version>
<postgresql.version>42.2.20postgresql.version>
<prometheus-pushgateway.version>0.9.0prometheus-pushgateway.version>
<quartz.version>2.3.2quartz.version>
<querydsl.version>4.3.1querydsl.version>
<r2dbc-bom.version>Arabba-SR10r2dbc-bom.version>
<rabbit-amqp-client.version>5.9.0rabbit-amqp-client.version>
<reactive-streams.version>1.0.3reactive-streams.version>
<reactor-bom.version>Dysprosium-SR20reactor-bom.version>
<rest-assured.version>3.3.0rest-assured.version>
<rsocket.version>1.0.5rsocket.version>
<rxjava.version>1.3.8rxjava.version>
<rxjava-adapter.version>1.2.1rxjava-adapter.version>
<rxjava2.version>2.2.21rxjava2.version>
<saaj-impl.version>1.5.3saaj-impl.version>
<selenium.version>3.141.59selenium.version>
<selenium-htmlunit.version>2.40.0selenium-htmlunit.version>
<sendgrid.version>4.4.8sendgrid.version>
<servlet-api.version>4.0.1servlet-api.version>
<slf4j.version>1.7.30slf4j.version>
<snakeyaml.version>1.26snakeyaml.version>
<solr.version>8.5.2solr.version>
<spring-amqp.version>2.2.18.RELEASEspring-amqp.version>
<spring-batch.version>4.2.7.RELEASEspring-batch.version>
<spring-data-releasetrain.version>Neumann-SR9spring-data-releasetrain.version>
<spring-framework.version>5.2.15.RELEASEspring-framework.version>
<spring-hateoas.version>1.1.5.RELEASEspring-hateoas.version>
<spring-integration.version>5.3.8.RELEASEspring-integration.version>
<spring-kafka.version>2.5.14.RELEASEspring-kafka.version>
<spring-ldap.version>2.3.4.RELEASEspring-ldap.version>
<spring-restdocs.version>2.0.5.RELEASEspring-restdocs.version>
<spring-retry.version>1.2.5.RELEASEspring-retry.version>
<spring-security.version>5.3.9.RELEASEspring-security.version>
<spring-session-bom.version>Dragonfruit-SR3spring-session-bom.version>
<spring-ws.version>3.0.10.RELEASEspring-ws.version>
<sqlite-jdbc.version>3.31.1sqlite-jdbc.version>
<sun-mail.version>1.6.7sun-mail.version>
<thymeleaf.version>3.0.12.RELEASEthymeleaf.version>
<thymeleaf-extras-data-attribute.version>2.0.1thymeleaf-extras-data-attribute.version>
<thymeleaf-extras-java8time.version>3.0.4.RELEASEthymeleaf-extras-java8time.version>
<thymeleaf-extras-springsecurity.version>3.0.4.RELEASEthymeleaf-extras-springsecurity.version>
<thymeleaf-layout-dialect.version>2.4.1thymeleaf-layout-dialect.version>
<tomcat.version>9.0.46tomcat.version>
<unboundid-ldapsdk.version>4.0.14unboundid-ldapsdk.version>
<undertow.version>2.1.7.Finalundertow.version>
<versions-maven-plugin.version>2.7versions-maven-plugin.version>
<webjars-hal-browser.version>3325375webjars-hal-browser.version>
<webjars-locator-core.version>0.45webjars-locator-core.version>
<wsdl4j.version>1.6.3wsdl4j.version>
<xml-maven-plugin.version>1.0.2xml-maven-plugin.version>
<xmlunit2.version>2.7.0xmlunit2.version>
properties>
这就是我们为什么可以在dependencyManagement可以直接锁定版本的原因了。
如果你是刚学完SSM框架,如果你想学系统的学习SpringBoot,如果你想使用SpringBoot去集成各种其他组件,那么我这份循序渐进学SpringBoot一定是首选,带你从零到深入学习SpringBoot。抓紧订阅起来吧。用知识点+案例+项目解读的学习模式由浅入深对Spring Boot框架进行学习&使用。