成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Maven optional關鍵字透徹圖解

開發 后端
本來想寫一篇「如何自定義Spring Boot Starter」,但是為了更好理解 Starter 的一些設計理念和其中的關鍵點,所以提前將一些細節內容單獨提取出來講解說明。

 寫在前面

本來想寫一篇「如何自定義Spring Boot Starter」,但是為了更好理解 Starter 的一些設計理念和其中的關鍵點,所以提前將一些細節內容單獨提取出來講解說明

在 Maven pom.xml 中,你經常會看到依賴項中有類似下面的代碼: 

  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 關鍵字的奧秘

老規矩,畫個圖說明問題:

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

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

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

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

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

實際案例

在 spring-boot-actuator pom.xml 文件中,有超過 20 個依賴是 optional

因為 Spring Boot 不可能將沒必要的依賴也打包到你最終的 jar package 中,所以用到 spring boot actuator 的項目最終生成的 jar package 中不會包含這 20 多個依賴 jar,如果你要用到哪一個,顯式的加入到你的項目就好了

在接下來的文章,自定義 Spring Boot Starter 也是這個策略,因為 starter 是包含特定功能為其他項目服務用的,類似本文的 Project C 的角色了,到這里你理解 optional 的奧秘了嗎?

反向應用

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

  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> 

總結

到這里,在你今后設計功能性依賴時,你應該明白怎樣設計依賴關系了, 我這里推薦使用 optional 的形式,簡單來說,你設計的依賴什么菜都有,想吃什么菜自己 "抱蔡明" 就好,接下來我們就模擬官方標準創建自定義的 starter...... 博客 訪問恢復正常,歡迎交流 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2009-08-21 14:58:56

C# this關鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關鍵字

2009-09-17 09:30:00

Linq LET關鍵字

2022-01-04 16:35:42

C++Protected關鍵字

2012-03-01 12:50:03

Java

2009-09-02 09:24:03

C# this關鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2009-12-17 13:57:15

Ruby關鍵字

2009-08-06 17:52:23

C#增加that關鍵字

2009-08-13 17:44:34

C# using關鍵字

2009-08-26 15:16:29

C# lock關鍵字

2024-03-15 15:12:27

關鍵字底層代碼

2011-06-14 13:26:27

volatile

2009-08-21 14:47:59

C# base關鍵字

2021-08-06 07:51:47

關鍵字int函數

2022-11-12 18:32:50

Golangomitemptyjson

2022-01-10 18:11:42

C語言應用技巧

2022-02-17 08:31:38

C語言staic關鍵字

2022-06-29 08:05:25

Volatile關鍵字類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产.com| 色综合av | 亚洲高清中文字幕 | 欧美福利 | 伊人久久在线观看 | 色婷婷av久久久久久久 | 少妇一区在线观看 | 日韩精品一区二区三区高清免费 | av天天干 | 国产一级视频在线播放 | 亚洲精品女优 | 少妇特黄a一区二区三区88av | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 成人免费区一区二区三区 | 亚洲久久一区 | 免费黄色大片 | www.788.com色淫免费| 巨大黑人极品videos精品 | 欧美在线视频一区二区 | 久久久久久久久久久一区二区 | 97精品超碰一区二区三区 | 日韩综合一区 | 夜久久| 亚洲欧美在线观看视频 | 一区免费 | 亚洲 欧美 精品 | 国产激情免费视频 | 狠狠干美女| 在线播放中文字幕 | 欧美一级艳情片免费观看 | 国产污视频在线 | 天堂久久天堂综合色 | 亚洲午夜精品在线观看 | 欧美一级欧美三级在线观看 | 精品在线播放 | 91精品国产91久久久久久吃药 | 中文字幕亚洲一区二区va在线 | 黄网站色大毛片 | 看片国产 | 日韩精品一区二区三区中文在线 | 自拍第1页 |