Springboot项目固化依赖的那点事

Posted 于大圣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot项目固化依赖的那点事相关的知识,希望对你有一定的参考价值。

 

 

前言:在正式理解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框架开发项目的复杂度,统一管理依赖版本等来避免开发过程出错等!

以上,完了

以上是关于Springboot项目固化依赖的那点事的主要内容,如果未能解决你的问题,请参考以下文章

关于java项目与web项目中lib包的那点事

Spring Boot 二三事:WEB 应用消息推送的那点事

Hbase聊聊RIT的那点事

HBase运维实践-聊聊RIT的那点事

iOS开发中ARC的那点事

微信支付服务商开发相关的那点事