欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年11月05日 09:32:23   作者:日拱一兵  
這篇文章主要介紹了詳解Maven optional關(guān)鍵字透徹圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

寫(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ì)看到依賴(lài)項(xiàng)中有類(lèi)似下面的代碼:

<dependency>
 <groupId>sample.ProjectA</groupId>
 <artifactId>Project-A</artifactId>
 <version>1.0</version>
 <scope>compile</scope>
 <optional>true</optional> 
</dependency>

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

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>

總結(jié)

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

靈魂追問(wèn)

  1. 有很多童鞋項(xiàng)目組用的構(gòu)建工具時(shí) Gradle,你知道 Gradle 中是怎樣表示的嗎?
  2. 自定義 starter,你知道官方標(biāo)準(zhǔn) starter 的結(jié)構(gòu)是什么樣的嗎?

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論