SpringBoot2.x的依賴(lài)管理配置
前提
這篇文章是《SpringBoot2.x入門(mén)》專(zhuān)輯的第1篇文章,使用的SpringBoot
版本為2.3.1.RELEASE
,JDK
版本為1.8
。
主要梳理一下SpringBoot2.x
的依賴(lài)關(guān)系和依賴(lài)的版本管理,依賴(lài)版本管理是開(kāi)發(fā)和管理一個(gè)SpringBoot
項(xiàng)目的前提。
SpringBoot
其實(shí)是通過(guò)starter
的形式,對(duì)spring-framework
進(jìn)行裝箱,消除了(但是兼容和保留)原來(lái)的XML
配置,目的是更加便捷地集成其他框架,打造一個(gè)完整高效的開(kāi)發(fā)生態(tài)。
SpringBoot依賴(lài)關(guān)系
因?yàn)閭€(gè)人不太喜歡Gradle
,所以下文都以Maven
舉例。
和SpringCloud的版本(SpringCloud的正式版是用倫敦地鐵站或者說(shuō)倫敦某地名的英文名稱(chēng)作為版本號(hào),例如比較常用的F版本Finchley就是位于倫敦北部芬奇利)管理不同,SpringBoot的依賴(lài)組件發(fā)布版本格式是:X.Y.Z.RELEASE。因?yàn)镾pringBoot組件一般會(huì)裝箱為starter,所以組件的依賴(lài)GAV一般為:org.springframework.boot:spring-boot-starter-${組件名}:X.Y.Z.RELEASE,其中X是主版本,不同的主版本意味著可以放棄兼容性,也就是SpringBoot1.x和SpringBoot2.x并不保證兼容性,而組件名一般是代表一類(lèi)中間件或者一類(lèi)功能,如data-redis(spring-boot-starter-data-redis,提供Redis訪(fǎng)問(wèn)功能)、jdbc(spring-boot-starter-jdbc,提供基于JDBC驅(qū)動(dòng)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)功能)等等。以SpringBoot當(dāng)前最新的發(fā)布版本2.3.1.RELEASE的org.springframework.boot:spring-boot-starter:jar:2.3.1.RELEASE為例,用mvn dependency:tree分析它的依賴(lài)關(guān)系如下:
這個(gè)依賴(lài)樹(shù)也印證了starter
是基于Spring
項(xiàng)目裝箱和擴(kuò)展的。
SpringBoot依賴(lài)管理
如果使用Spring Initializr創(chuàng)建一個(gè)SpringBoot
項(xiàng)目的話(huà),那么會(huì)發(fā)現(xiàn)項(xiàng)目的POM
文件中會(huì)加入了一個(gè)parent
元素:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
其實(shí)spring-boot-starter-parent
相當(dāng)于作為了當(dāng)前項(xiàng)目的父模塊,在父模塊里面管理了當(dāng)前指定的SpringBoot
版本2.3.1.RELEASE
所有依賴(lài)的第三方庫(kù)的統(tǒng)一版本管理,通過(guò)spring-boot-starter-parent
上溯到最頂層的項(xiàng)目,會(huì)找到一個(gè)properties
元素,里面統(tǒng)一管理Spring
框架和所有依賴(lài)到的第三方組件的統(tǒng)一版本號(hào),這樣就能確保對(duì)于一個(gè)確定的SpringBoot
版本,它引入的其他starter
不再需要指定版本,同時(shí)所有的第三方依賴(lài)的版本也是固定的。如項(xiàng)目的POM
文件如下:
<!-- 暫時(shí)省略其他的配置屬性 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
這樣只需要修改parent
元素中的版本號(hào),就能全局更變所有starter
的版本號(hào)。這種做法其實(shí)本質(zhì)上是把當(dāng)前項(xiàng)目作為spring-boot-starter-parent
的子項(xiàng)目,其實(shí)在一定程度上并不靈活。這里推薦使用另一種方式:通過(guò)dependencyManagement
元素全局管理SpringBoot
版本,適用于單模塊或者多模塊的Maven
項(xiàng)目。項(xiàng)目的(父)POM
文件如下:
<!-- spring-boot-guide 父POM --> <properties> <spring.boot.version>2.3.1.RELEASE</spring.boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring.boot.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
然后需要用到其他starter
的時(shí)候,只需要在dependencies
直接引入即可,不再需要指定版本號(hào),版本號(hào)由dependencyManagement
中定義的版本號(hào)統(tǒng)一管理。
<!-- spring-boot-guide/ch0-dependency 子POM --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
SpringBoot依賴(lài)覆蓋
有些特殊的情況,可能項(xiàng)目中大部分的starter
使用的是相對(duì)低的版本,但是由于部分新的功能需要使用到更高版本的個(gè)別starter
,則需要強(qiáng)制引入該高版本的starter
。這里舉一個(gè)例子,項(xiàng)目用到的SpringBoot
組件的版本是2.1.5.RELEASE
,使用的中間件服務(wù)Elasticsearch
的版本是7.x
,而spring-boot-starter-data-elasticsearch
支持的版本如下:
理論上可以一下子升級(jí)SpringBoot
到2.3.1.RELEASE
,其實(shí)也可以直接指定spring-boot-starter-data-elasticsearch
的版本覆蓋掉全局的SpringBoot
組件版本,這里應(yīng)用了Maven
的依賴(lài)調(diào)解原則:
<!-- 父POM或者全局POM --> <properties> <spring.boot.version>2.1.5.RELEASE</spring.boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring.boot.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.3.1.RELEASE</version> </dependency> </dependencies>
這樣就能單獨(dú)提升spring-boot-starter-data-elasticsearch
的版本為2.3.1.RELEASE
,其他組件的版本依然保持為2.1.5.RELEASE
。
小結(jié)
目前有兩種常用的方式管理SpringBoot
組件的版本(兩種方式二選一):
- 配置
parent
元素,通過(guò)項(xiàng)目繼承的方式指定SpringBoot
組件的版本號(hào),這是Spring Initializr
生成的項(xiàng)目中默認(rèn)的配置方式。 - 配置
dependencyManagement
元素(推薦此方式),通過(guò)(父)POM
文件統(tǒng)一指定SpringBoot
組件的版本號(hào)。
另外,SpringBoot
的1.x
和2.x
之間有兼容性問(wèn)題(最明顯的一點(diǎn)是2.x
中刪除了1.x
中大量的內(nèi)建類(lèi),如果用到了這些SpringBoot
中的內(nèi)建類(lèi),容易出現(xiàn)ClassNotFoundException
),降級(jí)或者升級(jí)都有比較大的風(fēng)險(xiǎn)。一般情況下,建議使用同一個(gè)大版本進(jìn)行項(xiàng)目開(kāi)發(fā),如果確定需要進(jìn)行大版本切換,請(qǐng)務(wù)必做完畢的功能測(cè)試。
到此這篇關(guān)于SpringBoot2.x的依賴(lài)管理配置的文章就介紹到這了,更多相關(guān)SpringBoot2.x 依賴(lài)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
作者: throwable
出處:https://www.cnblogs.com/throwable/p/13206029.html
相關(guān)文章
Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實(shí)例分析
這篇文章主要介紹了Java構(gòu)造代碼塊,靜態(tài)代碼塊,結(jié)合實(shí)例形式分析了Java構(gòu)造代碼塊,靜態(tài)代碼塊的功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04maven配置阿里云倉(cāng)庫(kù)的實(shí)現(xiàn)方法
本文主要介紹了maven配置阿里云倉(cāng)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java實(shí)現(xiàn)數(shù)獨(dú)小游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)獨(dú)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南
在項(xiàng)?開(kāi)發(fā)中,對(duì)于前端提交的表單,后臺(tái)接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會(huì)加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來(lái)避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-07-07java之Timer和TimerTask簡(jiǎn)單demo(分享)
下面小編就為大家?guī)?lái)一篇java之Timer和TimerTask簡(jiǎn)單demo(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Java利用EasyExcel實(shí)現(xiàn)導(dǎo)出導(dǎo)入功能的示例代碼
EasyExcel是一個(gè)基于Java的、快速、簡(jiǎn)潔、解決大文件內(nèi)存溢出的Excel處理工具。本文廢話(huà)不多說(shuō),直接上手試試,用代碼試試EasyExcel是否真的那么好用2022-11-11java property配置文件管理工具框架過(guò)程詳解
這篇文章主要介紹了java property配置文件管理工具框架過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11