前言:在正式理解parent元素之前,假定你已经阅读maven的聚合和继承详解这篇博客,对maven继承的原理有一定理解。众所周知,如果使用maven构建Springboot应用,那么pom文件中一般都会指定如下配置来引入Springboot,本文重点来了解下spring-boot-starter-parent下重点有哪些内容,然后探讨下如果当前应用已存在parent的前提下如何改造项目依然使用springboot功能
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
我们首先进入到artifactId为spring-boot-starter-parent的pom中,如下结构,我们会发现在这个父pom中并没有声明任何dependency,但也有一个artifactId为pring-boot-dependencies的父pom ,我们接下来进入这个父pom再次看一下
artifactId为pring-boot-dependencies的父pom结构如下,在箭头所指向的dependencyManagement定义了大约600个左右的依赖声明,。根据maven的聚合和继承详解讲解得知:父pom中的dependencyManagement只是起到一个声明的作用,并不会真正引入依赖,子pom按需在dependencies元素中引入即可。子pom实际引入几个,那么就会依赖几个;
通过如上两个图,可以得出一般的Springboot应用的maven继承关系:应用pom->spring-boot-starter-parent->spring-boot-dependencies,实际在spring-boot-dependencies提供了大量固化的依赖和插件,对于Springboot应用而言,只需要通过maven的parent元素继承Springboot官方提供的spring-boot-starter-parent即可。
对于Springboot应用中已存在parent的场景,Springboot官方推荐使用maven的dependencyManagement元素,类似如下配置来达成仍然使用Springboot提供依赖的目的。需要注意的是以下配置的作用只是将spring-boot-dependencies下的dependencyManagement中声明的依赖导入到当前pom的dependencyManagement中,dependencyManagement元素以外的内容不会导入,这个需要注意下;
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
由于在spring-boot-starter-parent和spring-boot-dependencies中通过properties,dependencyManagement,pluginManagement等元素提供了大量固化的依赖和插件,推荐在子引用中直接使用parent元素继承即可。但在子应用已有parent且仍然想使用比如Springboot的依赖或者插件时,就需要单独编写配置,需要做如下改动:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>thinking-in-spring-boot</groupId>
<artifactId>first-app-by-gui</artifactId>
<version>0.0.1</version>
<name>first-app-by-gui</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.source>${java.version}</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 省略此处依赖 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
以下是推荐使用方式,大家可以对比下差异:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>thinking-in-spring-boot</groupId>
<artifactId>first-app-by-gui</artifactId>
<version>0.0.1</version>
<name>first-app-by-gui</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<!-- 省略依赖内容 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
总结:Springboot官方提供的artifactId:spring-boot-dependencies的pom,实际上提前定义了大量固化的依赖和插件,子应用通过maven的parent继承即可,本质还是利用Maven的继承特性;提供统一固化Maven依赖的好处是简化子应用使用Springboot框架开发项目的复杂度,统一管理依赖版本等来避免开发过程出错等!
以上,完了