深入探究 spring-boot-starter-parent的作用
一、前言
在idea當(dāng)中創(chuàng)建springboot項(xiàng)目的時(shí)候都會(huì)繼承一個(gè)spring-boot-starter-parent
作為父類(lèi),假如不繼承我們的項(xiàng)目就不能使用了嗎?他的作用是什么呢?報(bào)著這些疑問(wèn)我們進(jìn)行深度解析。
二、Maven繼承
Maven 在設(shè)計(jì)時(shí),借鑒了 Java 面向?qū)ο笾械睦^承思想,提出了 POM 繼承思想。當(dāng)一個(gè)項(xiàng)目包含多個(gè)模塊時(shí),可以在該項(xiàng)目中再創(chuàng)建一個(gè)父模塊,并在其 POM 中聲明依賴(lài),其他模塊的 POM 可通過(guò)繼承父模塊的 POM 來(lái)獲得對(duì)相關(guān)依賴(lài)的聲明
。對(duì)于父模塊而言,其目的是為了消除子模塊 POM 中的重復(fù)配置,其中不包含有任何實(shí)際代碼,因此父模塊 POM 的打包類(lèi)型(packaging)必須是 pom
。
通過(guò)mvn help:effective-pom 命令就可以查看項(xiàng)目的最終生成的pom(有效的pom)。
三、分析spring-boot-starter-parent
不繼承我們的項(xiàng)目就不能使用了嗎?
答:當(dāng)然不是,我們選擇該依賴(lài),然后按住ctrl就可以點(diǎn)進(jìn)去,可以看一下他都做了些什么,實(shí)際上就是給我們提供了一個(gè)管理的依賴(lài)pom,而并沒(méi)有真實(shí)的去引用任何依賴(lài)!
(1)了解spring-boot-starter-parent
spring-boot-starter-parent下大部門(mén)都是pluginManagement插件管理。
pluginManagement 元素與 dependencyManagement 元素的原理十分相似,在 pluginManagement 元素中可以聲明插件及插件配置,但不會(huì)發(fā)生實(shí)際的插件調(diào)用行為,只有在 POM 中配置了真正的 plugin 元素,且其 groupId 和 artifactId 與 pluginManagement 元素中配置的插件匹配時(shí),pluginManagement 元素的配置才會(huì)影響到實(shí)際的插件行為。
(2)了解spring-boot-dependencies
接下來(lái)我們?cè)冱c(diǎn)進(jìn)去spring-boot-dependencies看看,spring-boot-dependencies給我們提供了大量的dependencyManagement依賴(lài)版本管理。
Maven 可以通過(guò) dependencyManagement 元素對(duì)依賴(lài)進(jìn)行管理,它具有以下 2 大特性:
- 在該元素下聲明的依賴(lài)不會(huì)實(shí)際引入到模塊中,只有在 dependencies 元素下同樣聲明了該依賴(lài),才會(huì)引入到模塊中。
- 該元素能夠約束 dependencies 下依賴(lài)的使用,即 dependencies 聲明的依賴(lài)若未指定版本,則使用 dependencyManagement 中指定的版本,否則將覆蓋 dependencyManagement 中的版本。
(3)不引用spring-boot-starter-parent項(xiàng)目如何正常使用
新建一個(gè)空項(xiàng)目,只引入web(注意沒(méi)有引入boot版本管理,那就需要手動(dòng)添加版本號(hào)),springboot照樣可以啟動(dòng)的喲
四、Maven單繼承問(wèn)題
現(xiàn)在有個(gè)問(wèn)題,我現(xiàn)在想使用spring-boot-starter-parent
提供的依賴(lài)管理,但是我又不想繼承他,因?yàn)槲疫€要繼承別的項(xiàng)目,這時(shí)候該怎么辦呢?
maven和Java一樣都是單繼承機(jī)制,maven當(dāng)中有
<type>pom</type>和<scope>import</scope>
,通過(guò)這兩個(gè)標(biāo)簽在dependencyManagement中聲明依賴(lài),可以替代繼承(達(dá)到類(lèi)似parent標(biāo)簽的作用,解決了單繼承問(wèn)題)。
<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> 類(lèi)似于 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.10</version> <relativePath/> </parent>
只是類(lèi)似,并不完全替代繼承。為什么這么說(shuō)?請(qǐng)看如下示例:spring-boot-starter-parent的pluginManagement是有對(duì)spring-boot-maven-plugin版本進(jìn)行管理的:
找不到說(shuō)明一個(gè)原因,導(dǎo)入的配置沒(méi)有生效!
說(shuō)明使用dependencyManagement來(lái)替代parent的時(shí)候,pluginManagement里面嵌套的plugins版本并沒(méi)有繼承過(guò)來(lái)。
注:import 依賴(lài)范圍只能與 dependencyManagement 元素配合使用才會(huì)有效,其功能是將目標(biāo) pom.xml 中的 dependencyManagement 配置導(dǎo)入合并到當(dāng)前 pom.xml 的 dependencyManagement 中。
因此便可以明白,解決單繼承的時(shí)候?yàn)槭裁垂倬W(wǎng)讓我們導(dǎo)入
spring-boot-dependencies
,而不是spring-boot-starter-parent
,因?yàn)閟pring-boot-starter-parent當(dāng)中繼承了spring-boot-dependencies,但是parent實(shí)際上就是提供了一些pluginManagement,而使用import 導(dǎo)入的形式根本無(wú)法將這些導(dǎo)入。
五、不繼承spring-boot-starter-parent需要注意的
假如不繼承spring-boot-starter-parent,我們還需要自己聲明打包插件。spring-boot-starter-parent配置的插件就是打出來(lái)一個(gè)可直接運(yùn)行的jar。
假如我們只聲明如下,打出來(lái)的jar包是啟動(dòng)不起來(lái)的,打出來(lái)的jar包并不會(huì)將依賴(lài)的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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程之深入理解Synchronized的使用
文詳細(xì)講述了線(xiàn)程、進(jìn)程的關(guān)系及在操作系統(tǒng)中的表現(xiàn),這是多線(xiàn)程學(xué)習(xí)必須了解的基礎(chǔ)。本文將接著講一下Java線(xiàn)程同步中的一個(gè)重要的概念synchronized,希望能夠給你有所幫助2021-06-06已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法
這篇文章主要介紹了已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03spring+maven實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了spring+maven實(shí)現(xiàn)發(fā)送郵件功能,利用spring提供的郵件工具來(lái)發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07SpringBoot實(shí)現(xiàn)二維碼掃碼登錄的原理及項(xiàng)目實(shí)踐
本文主要介紹了SpringBoot實(shí)現(xiàn)二維碼掃碼登錄的原理及項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04java求100以?xún)?nèi)的素?cái)?shù)示例分享
素?cái)?shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以?xún)?nèi)的素?cái)?shù)示例,需要的朋友可以參考下2014-03-03Linux系統(tǒng)Docker拉取JDK21鏡像超細(xì)詳解
這篇文章主要介紹了如何在Linux系統(tǒng)上使用Docker拉取JDK21鏡像,并基于該鏡像搭建開(kāi)發(fā)和測(cè)試環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12Java Comparable 和 Comparator 的詳解及區(qū)別
這篇文章主要介紹了Java Comparable 和 Comparator 的詳解及區(qū)別的相關(guān)資料,Comparable 自然排序和Comparator 定制排序的實(shí)例,需要的朋友可以參考下2016-12-12mybatis使用@mapkey獲取的結(jié)果的鍵(key)為null問(wèn)題
這篇文章主要介紹了mybatis使用@mapkey獲取的結(jié)果的鍵(key)為null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06