maven 依賴版本管理 | 您所在的位置:網(wǎng)站首頁 › 屬牛的大利月和小利月是哪幾個(gè) › maven 依賴版本管理 |
在開發(fā) spring boot 項(xiàng)目時(shí),你是否遇到過,有些依賴即使不寫版本號也能下載到某一版本的依賴。 比如下面這個(gè)案例 案例pom文件 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.9.RELEASE com.wqlm boot 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 org.springframework.boot spring-boot-maven-plugin可以看到 下配置了三個(gè)依賴項(xiàng) spring-boot-starter-webmysql-connector-javamybatis-spring-boot-starter這個(gè)項(xiàng)目雖然引用了三個(gè)依賴,但只有 mybatis-spring-boot-starter 這個(gè)依賴是寫了版本號的,其余兩個(gè)沒寫。 我們知道導(dǎo)入一個(gè)依賴需要提供依賴的坐標(biāo) (groupId、artifactId、version) 既然 spring-boot-starter-web 和 mysql-connector-java 沒有提供 version,那么應(yīng)該無法正確下載依賴才對。 但實(shí)際情況如圖
parent 不知道大家注意到?jīng)],該 pom 是有 parent 的 org.springframework.boot spring-boot-starter-parent 2.1.9.RELEASE也就是說該項(xiàng)目繼承自 spring-boot-starter-parent 項(xiàng)目。具體繼承了那些東西,我們點(diǎn)進(jìn)去及可以看到了 如下圖 spring-boot-starter-parent 又繼承自 spring-boot-dependencies
spring-boot-dependencies.pom 下面是 spring-boot-dependencies-2.1.9.RELEASE.pom 中的部分內(nèi)容
其中 properties 定義了一系列的版本號,并且在 dependencyManagement 中使用了版本號。注意這個(gè) dependencyManagement,它的下級是我們最常用的 dependencies 組件 我們知道 dependencies 組件是用來引入依賴的,那在外面包上一層 dependencyManagement 是什么意思呢?它的意思是,聲明 dependencies 中的依賴,但不引用!!!那什么時(shí)候引用呢?當(dāng)子項(xiàng)目中配置了一個(gè) dependency ,并且這個(gè) dependency沒寫版本號,且在 dependencyManagement 中聲明過時(shí)才引用。 這就是為什么有的依賴包需要寫版本號,有的不需要寫。那些不需要寫版本號的依賴,其實(shí)在它的父pom的dependencyManagement中已經(jīng)申明好了,而且不僅申明了 version,有的還申明了 exclusions ,用于剔除某些沖突的依賴 pluginManagement上面說了 dependency,plugin 也是同理。不信你回頭看案例的pom文件,它里面就定義了一個(gè) spring-boot-maven-plugin 的插件,也沒有寫版本號。 org.springframework.boot spring-boot-maven-plugin它的版本號同樣是在父pom的 pluginManagement 中申明好的 dependencies 組件dependencies 組件用于導(dǎo)入依賴,且所有 dependencies 里的依賴都會被子項(xiàng)目繼承。 公共依賴版本管理像 spring boot 這種大體量的框架,旗下子項(xiàng)目眾多,比如 spring-boot-starter-webspring-boot-starter-amqpspring-boot-starter-data-redis… 這些子項(xiàng)目也有各自的依賴,其中有些依賴是公共的,比如spring-boot-starter-web-2.1.9.RELEASE 和 spring-boot-starter-data-redis–2.1.9.RELEASE 的依賴結(jié)構(gòu)如下 他們都依賴了 spring-boot-starter,既然都是 spring-boot 的子項(xiàng)目,并且版本號也一樣,那么他們兩個(gè)依賴的 spring-boot-starter 的版本也應(yīng)該要一樣,不然同時(shí)引用他們兩個(gè)就會出現(xiàn)依賴沖突! 如何保證所有子項(xiàng)目的公共依賴的版本一致呢,總不能在每個(gè)子項(xiàng)目里寫死吧,這樣手動去管理得累死。 所以 spring boot 將所有公共依賴抽離出來,放到 spring-boot-dependencies 中來管理。 所有的子項(xiàng)目都直接或間接繼承自 spring-boot-dependencies,這樣同一個(gè)版本的所有的子項(xiàng)目的公共依賴就都一樣了。 但這樣做帶來了一個(gè)問題,每個(gè)子項(xiàng)目都繼承了所有的公共依賴,解決這件事情,就需要使用 maven 的 dependencyManagement 組件 dependencyManagement 組件作用:用來申明依賴,但不導(dǎo)入。 dependencies 組件用于導(dǎo)入依賴,注意兩者區(qū)別 特性 子項(xiàng)目不會繼承 dependencyManagement 組件中聲明的依賴。但如果子項(xiàng)目想導(dǎo)入某個(gè)父pom 中 dependencyManagement 中的依賴,只需要填寫 groupId 和 artifactId ,不需要填寫版本號,maven會自動去父pom 的 dependencyManagement 中找對應(yīng)的 version,包括scope、exclusions等使用 dependencyManagement 組件后,所有的子項(xiàng)目只需要在父pom 的 “公共依賴聲明池” 中挑選自己想要的依賴,而不用關(guān)心版本。這樣即不會繼承到不需要的依賴,又統(tǒng)一了依賴的版本 如果想統(tǒng)一調(diào)整所有子項(xiàng)目某個(gè)依賴的版本,只需要在父pom 里更新。不需要修改任何一個(gè)子項(xiàng)目。 如果某個(gè)子項(xiàng)目不想使用公共的版本號,只需要在 dependency 中加上版本號,子項(xiàng)目就會使用自定義的版本號,不會繼承父類版本號。 spring boot 就是通過這樣來統(tǒng)一管理依賴版本的 基于這樣的特性, dependencyManagement 組件 一般用于統(tǒng)一管理子項(xiàng)目的公共依賴的版本 依賴版本的查找 Maven會沿著父子層次向上走,直到找到一個(gè)擁有 dependencyManagement 組件的項(xiàng)目,然后在其中查找,如果找到則返回申明的依賴,沒有繼續(xù)往下找。 dependencies 與 dependencyManagement 的區(qū)別dependencies 引入依賴即使子項(xiàng)目中不寫 dependencies ,子項(xiàng)目仍然會從父項(xiàng)目中繼承 dependencies 中的所有依賴項(xiàng)dependencyManagement 聲明依賴,并不引入依賴。子項(xiàng)目默認(rèn)不會繼承父項(xiàng)目 dependencyManagement 中的依賴只有在子項(xiàng)目中寫了該依賴項(xiàng),并且沒有指定具體版本,才會從父項(xiàng)目中繼承(version、exclusions、scope等讀取自父pom)子項(xiàng)目如果指定了依賴的具體版本號,會優(yōu)先使用子項(xiàng)目中指定版本,不會繼承父pom中申明的依賴 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |