原本想寫一篇「如何自定義Spring Boot Starter」,可是爲了更好理解 Starter 的一些設計理念和其中的關鍵點,因此提早將一些細節內容單獨提取出來說解說明mysql
在 Maven pom.xml 中,你常常會看到依賴項中有相似下面的代碼:面試
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
複製代碼
這裏的 <optional>true</optional>
是什麼意思呢?spring
老規矩,畫個圖說明問題:sql
因爲 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 類,不能被其餘類繼承同樣)oracle
若是 project D 確實須要用到 project C 中的 OptionalFeatureAClass 怎麼辦呢?那咱們就須要在 project D 的 pom.xml 中顯式的添加聲明 project A 依賴,繼續看下圖:maven
Project D 須要用到 Project A 的 OptionalFeatureAClass,那麼須要在 Project D 的 pom.xml 文件中顯式的添加對 Project A 的依賴spring-boot
到這也就很好理解爲何 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 關鍵字,很少說,上一段代碼就懂了:
<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>
複製代碼
到這裏,在你從此設計功能性依賴時,你應該明白怎樣設計依賴關係了, 我這裏推薦使用 optional 的形式,簡單來講,你設計的依賴什麼菜都有,想吃什麼菜本身 "抱蔡明" 就好,接下來咱們就模擬官方標準建立自定義的 starter...... 博客 訪問恢復正常,歡迎交流
歡迎持續關注公衆號:「日拱一兵」
- 前沿 Java 技術乾貨分享
- 高效工具彙總 | 回覆「工具」
- 面試問題分析與解答
- 技術資料領取 | 回覆「資料」
以讀偵探小說思惟輕鬆趣味學習 Java 技術棧相關知識,本着將複雜問題簡單化,抽象問題具體化和圖形化原則逐步分解技術問題,技術持續更新,請持續關注......