溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Maven中optional關(guān)鍵字有什么用

發(fā)布時(shí)間:2021-07-23 16:09:22 來(lái)源:億速云 閱讀:253 作者:Leah 欄目:編程語(yǔ)言

Maven中optional關(guān)鍵字有什么用,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

optional 關(guān)鍵字的奧秘

老規(guī)矩,畫(huà)個(gè)圖說(shuō)明問(wèn)題:

由于 project C 使用到了兩個(gè)來(lái)自 project A 的類(lèi) (OptionalFeatureAClass) 和 project B 的類(lèi) (OptionalFeatureBClass). 如果 project C 沒(méi)有依賴(lài) packageA 和 packageB,那么編譯將會(huì)失敗。

project D 依賴(lài) project C,但是對(duì)于 project D 來(lái)說(shuō),類(lèi) (OptionalFeatureAClass) 和類(lèi) (OptionalFeatureBClass) 是可選的特性,所以為了讓最終的 war/ejb package 不包含不必要的依賴(lài),使用<optional> 聲明當(dāng)前依賴(lài)是可選的, 默認(rèn)情況下也不會(huì)被其他項(xiàng)目繼承(好比 Java 中的 final 類(lèi),不能被其他類(lèi)繼承一樣)

如果 project D 確實(shí)需要用到 project C 中的 OptionalFeatureAClass 怎么辦呢?那我們就需要在 project D 的 pom.xml 中顯式的添加聲明 project A 依賴(lài),繼續(xù)看下圖:

Project D 需要用到 Project A 的 OptionalFeatureAClass,那么需要在 Project D 的 pom.xml 文件中顯式的添加對(duì) Project A 的依賴(lài)

到這也就很好理解為什么 Maven 為什么要設(shè)計(jì) optional 關(guān)鍵字了,假設(shè)一個(gè)關(guān)于數(shù)據(jù)庫(kù)持久化的項(xiàng)目(Project C), 為了適配更多類(lèi)型的數(shù)據(jù)庫(kù)持久化設(shè)計(jì),比如 Mysql 持久化設(shè)計(jì)(Project A) 和 Oracle 持久化設(shè)計(jì)(Project B),當(dāng)我們的項(xiàng)目(Project D) 要用的 Project C 的持久化設(shè)計(jì),不可能既引入 mysql 驅(qū)動(dòng)又引入 oracle 驅(qū)動(dòng)吧,所以我們要顯式的指定一個(gè),就是這個(gè)道理了

實(shí)際案例

在 spring-boot-actuator pom.xml 文件中,有超過(guò) 20 個(gè)依賴(lài)是 optional

因?yàn)?Spring Boot 不可能將沒(méi)必要的依賴(lài)也打包到你最終的 jar package 中,所以用到 spring boot actuator 的項(xiàng)目最終生成的 jar package 中不會(huì)包含這 20 多個(gè)依賴(lài) jar,如果你要用到哪一個(gè),顯式的加入到你的項(xiàng)目就好了

在接下來(lái)的文章,自定義 Spring Boot Starter 也是這個(gè)策略,因?yàn)?starter 是包含特定功能為其他項(xiàng)目服務(wù)用的,類(lèi)似本文的 Project C 的角色了,到這里你理解 optional 的奧秘了嗎?

反向應(yīng)用

如果 Project C 引入的依賴(lài)沒(méi)有加 <optional>true</optional>,Project D 又需要依賴(lài) Project C,但只用到 Project A 的類(lèi)怎么辦呢?Maven 也是有解決辦法的,使用 exclusion 關(guān)鍵字,不多說(shuō),上一段代碼就懂了:

<dependencies>  <dependency>   <groupId>top.dayarch.demo</groupId>   <artifactId>Project-C</artifactId>   <exclusions>    <exclusion>     <groupId>top.dayarch.demo</groupId>     <artifactId>Project-B</artifactId>    </exclusion>   </exclusions>   </dependency></dependencies>

看完上述內(nèi)容,你們掌握Maven中optional關(guān)鍵字有什么用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI