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

Maven中optional標(biāo)簽用法詳解

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

一、前言

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

optional表示是否會(huì)傳遞依賴,有兩個(gè)可填值(假如不聲明optional標(biāo)簽,默認(rèn)就是false):

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

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

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

二、依賴傳遞代碼演示

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

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

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

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

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

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

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

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

答:不能訪問成功,直接會(huì)報(bào)找不到hutool的類

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

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

為此我專門在common當(dāng)中寫了一個(gè)方法,然后使用到了hutool當(dāng)中的類。

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

緊接著啟動(dòng)項(xiàng)目,啟動(dòng)download項(xiàng)目并沒有異常,只要訪問common包當(dāng)中方法帶有hutool相關(guān)的都報(bào)異常,說找不到hutool的包。因?yàn)槲覀儎倓傄部催^了,確實(shí)是沒有這個(gè)jar包。

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

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

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

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

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

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

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

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

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

但是在倉(cāng)庫(kù)當(dāng)中實(shí)際上是存在這個(gè)包的。那也就是證明項(xiàng)目不能引用可執(zhí)行jar。

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

四、是否會(huì)影響父子工程之間的依賴?yán)^承呢?

假如我在聚合工程的父pom依賴當(dāng)中使用optional為true,那子工程會(huì)繼承嗎?接下來(lái)進(jìn)行演示。

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

五、總結(jié)

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

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

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

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

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

相關(guān)文章

  • Quarkus集成apollo配置中心

    Quarkus集成apollo配置中心

    這篇文章主要介紹了Quarkus集成apollo配置中心,文中詳細(xì)的講解了Quarkus的config構(gòu)成,以及apollo集成實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • springboot亂碼問題解決方案

    springboot亂碼問題解決方案

    這篇文章主要介紹了springboot亂碼問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符出現(xiàn)次數(shù)的方法

    Java編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了Java編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符出現(xiàn)次數(shù)的方法,涉及java針對(duì)字符串的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • spring boot(一)之入門篇

    spring boot(一)之入門篇

    Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程。接下來(lái)通過本文給大家介紹spring boot入門知識(shí),需要的朋友參考下吧
    2017-05-05
  • Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    這篇文章主要介紹了Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中csv文件讀寫超詳細(xì)分析

    Java中csv文件讀寫超詳細(xì)分析

    CSV是一種通用的、相對(duì)簡(jiǎn)單的文件格式,其文件以純文本形式存儲(chǔ)表格數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中csv文件讀寫分析的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 概述Java的struts2框架

    概述Java的struts2框架

    本篇文章主要對(duì)struts2框架概念、優(yōu)缺點(diǎn)進(jìn)行簡(jiǎn)要概述。相信會(huì)對(duì)大家學(xué)習(xí)Java有所幫助,需要的朋友一起來(lái)看下吧
    2016-12-12
  • springboot中json對(duì)象中對(duì)Long類型和String類型相互轉(zhuǎn)換

    springboot中json對(duì)象中對(duì)Long類型和String類型相互轉(zhuǎn)換

    與前端聯(lián)調(diào)接口時(shí),后端一些字段設(shè)計(jì)為L(zhǎng)ong類型,這樣就有可能導(dǎo)致前端缺失精度,這時(shí)候我們就需要將Long類型返回給前端時(shí)做數(shù)據(jù)類型轉(zhuǎn)換,本文主要介紹了springboot中json對(duì)象中對(duì)Long類型和String類型相互轉(zhuǎn)換,感興趣的可以了解一下
    2023-11-11
  • Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析

    Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析

    這篇文章主要介紹了Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java中Long類型傳入前端數(shù)值出錯(cuò)問題

    Java中Long類型傳入前端數(shù)值出錯(cuò)問題

    這篇文章主要介紹了Java中Long類型傳入前端數(shù)值出錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評(píng)論