深入探究 spring-boot-starter-parent的作用
一、前言
在idea當(dāng)中創(chuàng)建springboot項目的時候都會繼承一個spring-boot-starter-parent作為父類,假如不繼承我們的項目就不能使用了嗎?他的作用是什么呢?報著這些疑問我們進(jìn)行深度解析。

二、Maven繼承
Maven 在設(shè)計時,借鑒了 Java 面向?qū)ο笾械睦^承思想,提出了 POM 繼承思想。當(dāng)一個項目包含多個模塊時,可以在該項目中再創(chuàng)建一個父模塊,并在其 POM 中聲明依賴,其他模塊的 POM 可通過繼承父模塊的 POM 來獲得對相關(guān)依賴的聲明。對于父模塊而言,其目的是為了消除子模塊 POM 中的重復(fù)配置,其中不包含有任何實際代碼,因此父模塊 POM 的打包類型(packaging)必須是 pom。
通過mvn help:effective-pom 命令就可以查看項目的最終生成的pom(有效的pom)。
三、分析spring-boot-starter-parent
不繼承我們的項目就不能使用了嗎?
答:當(dāng)然不是,我們選擇該依賴,然后按住ctrl就可以點進(jìn)去,可以看一下他都做了些什么,實際上就是給我們提供了一個管理的依賴pom,而并沒有真實的去引用任何依賴!
(1)了解spring-boot-starter-parent

spring-boot-starter-parent下大部門都是pluginManagement插件管理。
pluginManagement 元素與 dependencyManagement 元素的原理十分相似,在 pluginManagement 元素中可以聲明插件及插件配置,但不會發(fā)生實際的插件調(diào)用行為,只有在 POM 中配置了真正的 plugin 元素,且其 groupId 和 artifactId 與 pluginManagement 元素中配置的插件匹配時,pluginManagement 元素的配置才會影響到實際的插件行為。

(2)了解spring-boot-dependencies
接下來我們再點進(jìn)去spring-boot-dependencies看看,spring-boot-dependencies給我們提供了大量的dependencyManagement依賴版本管理。
Maven 可以通過 dependencyManagement 元素對依賴進(jìn)行管理,它具有以下 2 大特性:
- 在該元素下聲明的依賴不會實際引入到模塊中,只有在 dependencies 元素下同樣聲明了該依賴,才會引入到模塊中。
- 該元素能夠約束 dependencies 下依賴的使用,即 dependencies 聲明的依賴若未指定版本,則使用 dependencyManagement 中指定的版本,否則將覆蓋 dependencyManagement 中的版本。

(3)不引用spring-boot-starter-parent項目如何正常使用
新建一個空項目,只引入web(注意沒有引入boot版本管理,那就需要手動添加版本號),springboot照樣可以啟動的喲

四、Maven單繼承問題
現(xiàn)在有個問題,我現(xiàn)在想使用spring-boot-starter-parent提供的依賴管理,但是我又不想繼承他,因為我還要繼承別的項目,這時候該怎么辦呢?
maven和Java一樣都是單繼承機(jī)制,maven當(dāng)中有
<type>pom</type>和<scope>import</scope>,通過這兩個標(biāo)簽在dependencyManagement中聲明依賴,可以替代繼承(達(dá)到類似parent標(biāo)簽的作用,解決了單繼承問題)。

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</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>
只是類似,并不完全替代繼承。為什么這么說?請看如下示例:spring-boot-starter-parent的pluginManagement是有對spring-boot-maven-plugin版本進(jìn)行管理的:

找不到說明一個原因,導(dǎo)入的配置沒有生效!


說明使用dependencyManagement來替代parent的時候,pluginManagement里面嵌套的plugins版本并沒有繼承過來。
注:import 依賴范圍只能與 dependencyManagement 元素配合使用才會有效,其功能是將目標(biāo) pom.xml 中的 dependencyManagement 配置導(dǎo)入合并到當(dāng)前 pom.xml 的 dependencyManagement 中。
因此便可以明白,解決單繼承的時候為什么官網(wǎng)讓我們導(dǎo)入
spring-boot-dependencies,而不是spring-boot-starter-parent,因為spring-boot-starter-parent當(dāng)中繼承了spring-boot-dependencies,但是parent實際上就是提供了一些pluginManagement,而使用import 導(dǎo)入的形式根本無法將這些導(dǎo)入。
五、不繼承spring-boot-starter-parent需要注意的
假如不繼承spring-boot-starter-parent,我們還需要自己聲明打包插件。spring-boot-starter-parent配置的插件就是打出來一個可直接運(yùn)行的jar。

假如我們只聲明如下,打出來的jar包是啟動不起來的,打出來的jar包并不會將依賴的jar打進(jìn)去。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.10</version> </plugin> </plugins> </build>
到此這篇關(guān)于深入探究 spring-boot-starter-parent的作用的文章就介紹到這了,更多相關(guān)spring-boot-starter-parent內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程之深入理解Synchronized的使用
文詳細(xì)講述了線程、進(jìn)程的關(guān)系及在操作系統(tǒng)中的表現(xiàn),這是多線程學(xué)習(xí)必須了解的基礎(chǔ)。本文將接著講一下Java線程同步中的一個重要的概念synchronized,希望能夠給你有所幫助2021-06-06
已有的springcloud+mybatis項目升級為mybatis-plus的方法
這篇文章主要介紹了已有的springcloud+mybatis項目升級為mybatis-plus,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
spring+maven實現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了spring+maven實現(xiàn)發(fā)送郵件功能,利用spring提供的郵件工具來發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
SpringBoot實現(xiàn)二維碼掃碼登錄的原理及項目實踐
本文主要介紹了SpringBoot實現(xiàn)二維碼掃碼登錄的原理及項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Linux系統(tǒng)Docker拉取JDK21鏡像超細(xì)詳解
這篇文章主要介紹了如何在Linux系統(tǒng)上使用Docker拉取JDK21鏡像,并基于該鏡像搭建開發(fā)和測試環(huán)境,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
Java Comparable 和 Comparator 的詳解及區(qū)別
這篇文章主要介紹了Java Comparable 和 Comparator 的詳解及區(qū)別的相關(guān)資料,Comparable 自然排序和Comparator 定制排序的實例,需要的朋友可以參考下2016-12-12
mybatis使用@mapkey獲取的結(jié)果的鍵(key)為null問題
這篇文章主要介紹了mybatis使用@mapkey獲取的結(jié)果的鍵(key)為null問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

