自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Maven optional關(guān)鍵字透徹圖解

開(kāi)發(fā) 后端
本來(lái)想寫(xiě)一篇「如何自定義Spring Boot Starter」,但是為了更好理解 Starter 的一些設(shè)計(jì)理念和其中的關(guān)鍵點(diǎn),所以提前將一些細(xì)節(jié)內(nèi)容單獨(dú)提取出來(lái)講解說(shuō)明。

 寫(xiě)在前面

本來(lái)想寫(xiě)一篇「如何自定義Spring Boot Starter」,但是為了更好理解 Starter 的一些設(shè)計(jì)理念和其中的關(guān)鍵點(diǎn),所以提前將一些細(xì)節(jié)內(nèi)容單獨(dú)提取出來(lái)講解說(shuō)明

在 Maven pom.xml 中,你經(jīng)常會(huì)看到依賴項(xiàng)中有類似下面的代碼: 

  1. <dependency>  
  2.   <groupId>sample.ProjectA</groupId>  
  3.   <artifactId>Project-A</artifactId>  
  4.   <version>1.0</version>  
  5.   <scope>compile</scope>  
  6.   <optional>true</optional>   
  7. </dependency> 

這里的 <optional>true</optional> 是什么意思呢?

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

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

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

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

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

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

到這也就很好理解為什么 Maven 為什么要設(shè)計(jì) optional 關(guān)鍵字了,假設(shè)一個(gè)關(guān)于數(shù)據(jù)庫(kù)持久化的項(xiàng)目(Project C), 為了適配更多類型的數(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è)依賴是 optional

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

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

反向應(yīng)用

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

  1. <dependencies>  
  2.     <dependency>  
  3.       <groupId>top.dayarch.demo</groupId>  
  4.       <artifactId>Project-C</artifactId>  
  5.       <exclusions>  
  6.         <exclusion>  
  7.           <groupId>top.dayarch.demo</groupId>  
  8.           <artifactId>Project-B</artifactId>  
  9.         </exclusion>  
  10.       </exclusions>   
  11.     </dependency>  
  12. </dependencies> 

總結(jié)

到這里,在你今后設(shè)計(jì)功能性依賴時(shí),你應(yīng)該明白怎樣設(shè)計(jì)依賴關(guān)系了, 我這里推薦使用 optional 的形式,簡(jiǎn)單來(lái)說(shuō),你設(shè)計(jì)的依賴什么菜都有,想吃什么菜自己 "抱蔡明" 就好,接下來(lái)我們就模擬官方標(biāo)準(zhǔn)創(chuàng)建自定義的 starter...... 博客 訪問(wèn)恢復(fù)正常,歡迎交流 

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2009-08-21 14:58:56

C# this關(guān)鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關(guān)鍵字

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2012-03-01 12:50:03

Java

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2009-08-06 17:52:23

C#增加that關(guān)鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2009-08-13 17:44:34

C# using關(guān)鍵字

2009-08-21 14:47:59

C# base關(guān)鍵字

2009-12-17 13:57:15

Ruby關(guān)鍵字

2011-06-14 13:26:27

volatile

2021-08-06 07:51:47

關(guān)鍵字int函數(shù)

2022-01-10 18:11:42

C語(yǔ)言應(yīng)用技巧

2022-11-12 18:32:50

Golangomitemptyjson

2009-08-26 15:16:29

C# lock關(guān)鍵字

2009-08-13 13:04:29

C# lock關(guān)鍵字

2022-06-29 08:05:25

Volatile關(guān)鍵字類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)