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

Maven中optional標簽用法詳解

 更新時間:2023年05月19日 10:24:09   作者:怪?咖@  
這篇文章主要介紹了Maven中optional標簽,文章中有詳細的代碼示例供大家參考,對大家的學習或工作有一定的參考價值,感興趣的小伙伴可以借鑒一下

一、前言

<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.8.18</version>
  <optional>true</optional>
</dependency>

optional表示是否會傳遞依賴,有兩個可填值(假如不聲明optional標簽,默認就是false):

  • false: 傳遞依賴
  • true:不傳遞依賴

舉例:A引用了B的依賴,而B又引用了C依賴。

  • 假如B引用C依賴的時候沒有設(shè)置optional,那么A是可以使用C依賴的。
  • 假如B引用C依賴的時候?qū)ptional標簽設(shè)置為了true,那么在A當中就無法使用C依賴相關(guān)的方法,并且A調(diào)用B依賴的方法,而B依賴方法使用到了C,這時候會報找不到C依賴下的類,因為C不參與A的打包。

二、依賴傳遞代碼演示

(1)如下是一個父子聚合工程,不設(shè)置optional的情況:

打成jar包后,我們可以將jar解壓,解壓后在BOOT-INF的lib下存放著所能使用的依賴jar包,在這里可以看到hutool。

(2)設(shè)置optional為true的情況:

沒有那也就意味著我再download工程不能訪問hutool的類了,想要訪問只能在當前項目再次引用了。

(3)我有點好奇,既然這里看不到那么他究竟會參與打包嗎?假如不參與打包,我們download工程調(diào)用common中的方法,然后common中的方法又使用了hutool工具類,那能否訪問成功?接下來我們來一點一點的印證!

設(shè)置為true的時候是否會參與download工程的打包?

答:他是不會參與download的打包的,打成jar包后,我們可以將jar解壓,解壓后在BOOT-INF的lib下存放著所能使用的依賴jar包。

假如不參與打包,我們download工程調(diào)用common中的方法,然后common中的方法又使用了hutool工具類,那能否訪問成功?

答:不能訪問成功,直接會報找不到hutool的類

我解壓common包發(fā)現(xiàn)連BOOT-INF都沒有,并不是只有common的jar包解壓沒有,而是所有的都沒有。

我一直以為common包引用了hutool,那么解壓common包就應該在BOOT-INF下的jar中看到hutool.jar,其實不是的,maven打包會將所有依賴關(guān)系全部放到當前項目的BOOT-INF/jar目錄下。

為此我專門在common當中寫了一個方法,然后使用到了hutool當中的類。

然后我又在download工程下寫了一個接口,讓這個接口訪問common包下test方法。

緊接著啟動項目,啟動download項目并沒有異常,只要訪問common包當中方法帶有hutool相關(guān)的都報異常,說找不到hutool的包。因為我們剛剛也看過了,確實是沒有這個jar包。

從而也證明了,不管是當前項目引用的,還是間接引用的,jar包都存放在BOOT-INF下/jar目錄下,只要這下面沒有jar,那當前項目就不能用。

三、為啥common的jar包下沒有BOOT-INF呢?

在download下的BOOT-INF/lib下的common包解壓后沒有BOOT-INF我可以理解,因為所有的jar包都沒有。但是為什么target當中的jar包解壓后也沒有,而download卻有。他兩個唯一的區(qū)別就是,一個是有main函數(shù)的web工程,一個是連main方法都沒有的而且也沒有打包插件。

我的父工程繼承了spring-boot-starter-parent

而spring-boot-starter-parent當中對打包插件做了如下配置,也就意味著子工程一旦聲明該插件就會遵循如下配置:

于是我在common包下添加了打包插件。注意使用打包插件意味著打出來的jar是一個可以直接執(zhí)行的jar,因此必須要聲明main函數(shù),否則會打包異常的。

并且新增了一個主函數(shù)

于是再次打包,這時候會發(fā)現(xiàn)jar包大小已經(jīng)發(fā)生了變化。解壓后會發(fā)現(xiàn)他已經(jīng)存在BOOT-INF了。

但是詭異的一幕發(fā)生了,download引入了common包,并且download調(diào)用了common包下的方法,直接就mvn install 不通過了。說在倉庫找不到包。

但是在倉庫當中實際上是存在這個包的。那也就是證明項目不能引用可執(zhí)行jar。

于是我又把common的打包插件給去掉之后mvn install可以成功了。因此也證明了假如我們要封裝自己的jar,一定不要使用打包插件。一旦使用插件就會變成了可執(zhí)行jar,可執(zhí)行jar是不可以被別的項目所引用的。

四、是否會影響父子工程之間的依賴繼承呢?

假如我在聚合工程的父pom依賴當中使用optional為true,那子工程會繼承嗎?接下來進行演示。

注:在父工程設(shè)置optional為true,并不會影響子工程繼承該依賴。

五、總結(jié)

  • 將依賴設(shè)置為true不僅代表著依賴不會傳遞,就連打包的時候都不會將該jar打包進去,一旦使用到調(diào)用該jar包的方法就會異常。
  • 在父工程設(shè)置optional為true,并不會影響子工程繼承該依賴。
  • 不管是當前項目引用的,還是間接引用的,所有依賴jar包都存放在jar解壓后的BOOT-INF下/jar目錄下,只要這下面沒有jar,那當前項目就不能用。

什么時候?qū)ptional設(shè)置為true?

就拿hutool工具類來說,如下圖:你想用他的某些工具類,他還讓你引用一些第三方的依賴,為什么他不直接引用到自己的項目?

實際上hutool他肯定是引用了的,如果不引用他的項目可能連編譯都編譯不過,更別提打包給我們用了,他是將這個依賴設(shè)置為了true,假如誰用到了這塊的功能,誰自己引入這個依賴。這樣可以規(guī)避掉一些沒有用到這塊功能但是卻引入了沒有用的jar包。

以上就是Maven中optional標簽詳解的詳細內(nèi)容,更多關(guān)于Maven optional標簽的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源

    詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源

    這篇文章主要介紹了詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • WebUploader+SpringMVC實現(xiàn)文件上傳功能

    WebUploader+SpringMVC實現(xiàn)文件上傳功能

    WebUploader是由Baidu團隊開發(fā)的一個簡單的以HTML5為主,F(xiàn)LASH為輔的現(xiàn)代文件上傳組件。這篇文章主要介紹了WebUploader+SpringMVC實現(xiàn)文件上傳功能,需要的朋友可以參考下
    2017-06-06
  • Mybatis中使用in()查詢的方式詳解

    Mybatis中使用in()查詢的方式詳解

    當參數(shù)有值,添加條件查詢,附帶一個字符串的in查詢,下面這篇文章主要給大家介紹了關(guān)于Mybatis中使用in()查詢的方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Springboot3整合Elasticsearch8(elasticsearch-java)最佳實踐

    Springboot3整合Elasticsearch8(elasticsearch-java)最佳實踐

    文章推薦使用Elasticsearch官方新客戶端(ElasticsearchJavaAPIClient)替代已廢棄的RestHighLevelClient,對比SpringDataElasticsearch和easy-es的優(yōu)缺點,詳解SpringBoot3整合步驟及高階用法,強調(diào)新客戶端功能全且適配最新版本,感興趣的朋友一起看看吧
    2025-07-07
  • java 如何實現(xiàn)日志追蹤MDC

    java 如何實現(xiàn)日志追蹤MDC

    這篇文章主要介紹了java 實現(xiàn)日志追蹤MDC方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JavaWeb建立簡單三層項目步驟圖解

    JavaWeb建立簡單三層項目步驟圖解

    這篇文章主要介紹了JavaWeb建立簡單三層項目步驟圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Idea配置熱部署的詳細教程

    Idea配置熱部署的詳細教程

    這篇文章主要介紹了Idea配置熱部署的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java使用JSONObject操作json實例解析

    Java使用JSONObject操作json實例解析

    這篇文章主要介紹了Java使用JSONObject操作json,結(jié)合實例形式較為詳細的分析了Java使用JSONObject解析json數(shù)據(jù)相關(guān)原理、使用技巧與操作注意事項,需要的朋友可以參考下
    2020-04-04
  • @JsonSerialize(using = LongToStringUtil.class)注解的使用方式

    @JsonSerialize(using = LongToStringUtil.class)注解的使

    這篇文章主要介紹了@JsonSerialize(using = LongToStringUtil.class)注解的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進先出”?的原則.阻塞隊列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu)。本文將通過一些示例為大家詳細講講阻塞隊列的原理與使用,感興趣的小伙伴可以學習一下
    2022-10-10

最新評論

宿松县| 房产| 精河县| 永吉县| 南阳市| 河池市| 利辛县| 荥经县| 海盐县| 高尔夫| 庄河市| 勐海县| 新源县| 原平市| 双辽市| 达拉特旗| 新干县| 南昌市| 贡嘎县| 通城县| 长沙市| 屯门区| 贡嘎县| 台北县| 新源县| 无棣县| 乳山市| 绥江县| 汤阴县| 平安县| 石泉县| 格尔木市| 墨玉县| 滨海县| 高陵县| 北海市| 沈丘县| 大方县| 温泉县| 安吉县| 阿荣旗|