<kbd id="9plqc"><label id="9plqc"></label></kbd>

        <th id="9plqc"></th>
        1. <center id="9plqc"><video id="9plqc"></video></center>
          <sub id="9plqc"><form id="9plqc"><pre id="9plqc"></pre></form></sub>
          <nav id="9plqc"><form id="9plqc"><legend id="9plqc"></legend></form></nav>
          maven 依賴版本管理 您所在的位置:網(wǎng)站首頁 屬牛的大利月和小利月是哪幾個(gè) maven 依賴版本管理

          maven 依賴版本管理

          2024-09-21 08:02| 來源: 網(wǎng)絡(luò)整理| 查看: 265

          在開發(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í)際情況如圖

          在這里插入圖片描述 spring-boot-starter-web 和 mysql-connector-java 都能找到對應(yīng)的版本,這是為什么。

          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 在這里插入圖片描述 再點(diǎn)進(jìn)去可以看到 spring-boot-dependencies 的pom文件如下

          在這里插入圖片描述 可以看到 spring-boot-dependencies 沒有 parent, 說明它是頂級pom,其中 內(nèi)定義了很多版本號,mysql-connector-java 的版本號就在里面

          在這里插入圖片描述 是不是和上面看到的版本號一樣,都是8.0.17

          spring-boot-dependencies.pom

          下面是 spring-boot-dependencies-2.1.9.RELEASE.pom 中的部分內(nèi)容

          在這里插入圖片描述 注意以下三個(gè)組件

          propertiesdependencyManagementpluginManagement

          其中 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中申明的依賴


          【本文地址】

          公司簡介

          聯(lián)系我們

          今日新聞

          推薦新聞

          專題文章
            CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有
            黄色免费网站在线看,韩国精品在线观看,韩国美女一区二区,99国产热 大石桥市| 兰州市| 马边| 宁南县| 霍州市| 黄石市| 紫金县| 阿图什市| 沂源县| 济阳县| 大石桥市| 富源县| 江油市| 濮阳市| 徐水县| 芒康县| 肇庆市| 建平县| 常德市| 山西省| 华宁县| 台南市| 平潭县| 正安县| 土默特左旗| 且末县| 闻喜县| 常州市| 汨罗市| 余干县| 潢川县| 连州市| 铜陵市| 鄱阳县| 汉沽区| 乃东县| 无棣县| 白朗县| 新蔡县| 宁安市| 河北省| http://444 http://444 http://444 http://444 http://444 http://444