最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

寫在前面

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

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

<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ī)矩,畫個圖說明問題:

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

project D 依賴 project C,但是對于 project D 來說,類 (OptionalFeatureAClass) 和類 (OptionalFeatureBClass) 是可選的特性,所以為了讓最終的 war/ejb package 不包含不必要的依賴,使用<optional> 聲明當(dāng)前依賴是可選的, 默認(rèn)情況下也不會被其他項(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 文件中顯式的添加對 Project A 的依賴

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

實(shí)際案例

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

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

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

反向應(yīng)用

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

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

靈魂追問

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

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

相關(guān)文章

  • Java HashMap實(shí)現(xiàn)原理分析(一)

    Java HashMap實(shí)現(xiàn)原理分析(一)

    這篇文章主要介紹了Java HashMap實(shí)現(xiàn)原理的分析,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-08-08
  • Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理其實(shí)就是Spring MVC,因?yàn)檫@部分工作是Spring MVC做的而不是Spring Boot,那么,SpringMVC又是怎么處理文件上傳這個過程的呢?下面通過本文給大家詳細(xì)介紹下,一起看看吧
    2018-03-03
  • Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Spark MLlib隨機(jī)梯度下降法概述與實(shí)例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 關(guān)于Java中反射機(jī)制的深入講解

    關(guān)于Java中反射機(jī)制的深入講解

    反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的信息,并且可以操作類或?qū)ο蟮膬?nèi)部屬性,下面這篇文章主要給大家介紹了關(guān)于Java中反射機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2018-08-08
  • Mybatis的介紹、基本使用、高級使用

    Mybatis的介紹、基本使用、高級使用

    這篇文章主要介紹了Mybatis的介紹、基本使用、高級使用,Mybatis是一款半自動的ORM持久層框架,具有較高的SQL靈活性,如何使用看這篇就夠了,需要的朋友可以參考下
    2023-03-03
  • 實(shí)例解析Java關(guān)于static的作用

    實(shí)例解析Java關(guān)于static的作用

    只要是有學(xué)過Java的都一定知道static,也一定能多多少少說出一些作用和注意事項(xiàng)。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解定時任務(wù)框架Quartz的使用

    詳解定時任務(wù)框架Quartz的使用

    Quartz是OpenSymphony開源組織在Job?scheduling領(lǐng)域又一個開源項(xiàng)目,完全由Java開發(fā),可以用來執(zhí)行定時任務(wù),本文就來帶大家聊聊它的具體使用
    2023-02-02
  • Mybatis?SqlSession案例詳解

    Mybatis?SqlSession案例詳解

    這篇文章主要介紹了Mybatis?SqlSession詳解,本文我們講了如何創(chuàng)建SqlSession的幾個步驟,最后我們獲得一個DefaultSqlSession對象,里面包含了執(zhí)行器Executor和配置對象Configuration,需要的朋友可以參考下
    2023-04-04
  • springboot3如何接入nacos

    springboot3如何接入nacos

    這篇文章主要介紹了springboot3接入nacos的配置方法,經(jīng)過很長時間的折騰終于搞定,下面把步驟操作過程分享給大家,需要的朋友可以參考下
    2024-03-03
  • 淺析Spring中的循環(huán)依賴問題

    淺析Spring中的循環(huán)依賴問題

    這篇文章主要介紹了淺析Spring中的循環(huán)依賴問題,Spring 是利用了 三級緩存 來解決循環(huán)依賴的,其實(shí)現(xiàn)本質(zhì)是通過提前暴露已經(jīng)實(shí)例化但尚未初始化的 bean 來完成的,需要的朋友可以參考下
    2023-11-11

最新評論

宣化县| 垣曲县| 金山区| 江城| 彭阳县| 镇远县| 九龙城区| 七台河市| 乐至县| 高碑店市| 莱州市| 乌兰浩特市| 建德市| 公安县| 宁安市| 辽阳市| 诸暨市| 黔西县| 瑞丽市| 龙井市| 邳州市| 洪泽县| 东兰县| 长乐市| 婺源县| 安图县| 昭苏县| 潮安县| 贡嘎县| 广河县| 旅游| 林芝县| 大渡口区| 莱芜市| 香格里拉县| 正宁县| 秦安县| 丹棱县| 阳曲县| 洪湖市| 晋城|