深入探究 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配置的插件就是打出來一個可直接運行的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)文章
一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器
這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
springboot環(huán)境下配置使用sqlite數(shù)據(jù)庫方式
這篇文章主要介紹了springboot環(huán)境下配置使用sqlite數(shù)據(jù)庫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot項目讀取外置logback配置文件的問題及解決
SpringBoot項目讀取外置logback配置文件的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
Sa-Token不同模式實現(xiàn)單地登錄?多地登錄?同端互斥登錄
這篇文章主要為大家介紹了Sa-Token不同模式實現(xiàn)單地登錄?多地登錄?同端互斥登錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
利用Java將2019拆分成三個素數(shù)平方和的方法實例
這篇文章主要給大家介紹了關(guān)于利用Java將2019拆分成三個素數(shù)平方和的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

