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

Maven中optional和scope元素的使用弄明白了嗎

 更新時(shí)間:2020年12月03日 09:22:22   作者:secbro2  
這篇文章主要介紹了Maven中optional和scope元素的使用弄明白了嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在梳理項(xiàng)目的過程中發(fā)現(xiàn)很多開發(fā)同學(xué)對 Maven 依賴文件的配置并不了解,特別是對 Maven 的 optional 元素和 scope 元素的使用也非常隨意。這就會導(dǎo)致發(fā)布的 jar 包或 war 包非常 “胖”、編譯速度慢,而且還很容易生產(chǎn) jar 沖突等問題。本篇文章從 optional 和 scope 的使用場景入手,讓項(xiàng)目實(shí)現(xiàn)一波瘦身。

optional 元素

這里以 Spring Boot 項(xiàng)目中的使用為例,比如我們在項(xiàng)目中經(jīng)常使用的熱部署組件 spring-boot-devtools,就可以使用 optional 元素來進(jìn)行定義,對應(yīng) pom 文件中配置如下:

<!--devtools 熱部署-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

那么,這里的 optional 元素設(shè)置為 true 表示何意?optional 是 Maven 依賴 jar 時(shí)的一個(gè)選項(xiàng),表示該依賴是可選的,項(xiàng)目之間依賴不傳遞。不設(shè)置 optional(默認(rèn))或者 optional 是 false,表示傳遞依賴。

文字描述可能比較抽象,下面用具體實(shí)例場景來進(jìn)行更直觀的描述,這里假設(shè)有兩個(gè)項(xiàng)目 A 和 B,其中 A 為父項(xiàng)目,B 為子項(xiàng)目。在父項(xiàng)目中引入了單元測試的依賴:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>

下面針對 optional 元素的不同值進(jìn)行講解。

optional 元素默認(rèn)值(false)

當(dāng)父項(xiàng)目添加 junit 依賴時(shí),并未添加 optional 選項(xiàng),也就是默認(rèn)的 optional 元素的值為 false。

此時(shí),當(dāng)子項(xiàng)目依賴父項(xiàng)目時(shí),父項(xiàng)目 A 和子項(xiàng)目 B 的關(guān)系如下:

父項(xiàng)目并未設(shè)置 optional 元素為 true,那么便具有依賴傳遞性。此時(shí),子項(xiàng)目 B 中會直接引入父項(xiàng)目 A 中引入的 Junit 的 jar 包。也就是說 B 項(xiàng)目打包時(shí),jar/war 包中會包含 junit 的 jar 包。

optional 元素為 true

當(dāng)父項(xiàng)目引入 junit 依賴時(shí),設(shè)置 optional 元素為 true。那么,子項(xiàng)目 B 便有了更多的選擇。

如果項(xiàng)目 B 不需要 Junit 的 jar 包,那么在其 pom 文件中不需進(jìn)行任何處理便可以。如果 B 項(xiàng)目也需要對應(yīng)的 jar 包依賴,可以有兩種選擇:第一、A 項(xiàng)目中對應(yīng)依賴的 optional 設(shè)置為 false 或去掉;第二、B 項(xiàng)目中直接引入需要的該依賴。

parent 繼承的情況

我們經(jīng)常會在 parent 項(xiàng)目中配置統(tǒng)一的依賴版本控制,如下:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
</dependencyManagement>

此時(shí),如果 B 項(xiàng)目需要 Junit 的 jar 包,可以直接在項(xiàng)目中引入,這里父項(xiàng)目中的 optional 配置對子項(xiàng)目并無影響。
綜上所述,在 Maven 項(xiàng)目中,恰當(dāng)?shù)氖褂?optional 配置,可以在很大程度上減少 jar 包的大小,提升編譯和發(fā)布速度。

scope 元素

上面講完了 optional 元素的使用,再來看看 scope 的使用。
scope 元素主要用來控制依賴的使用范圍,指定當(dāng)前包的依賴范圍和依賴的傳遞性,也就是哪些依賴在哪些 classpath 中可用。常見的可選值有:compile, provided, runtime, test, system 等。

compile(編譯)

默認(rèn)值。compile 表示對應(yīng)依賴會參與當(dāng)前項(xiàng)目的編譯、測試、運(yùn)行等,是一個(gè)比較強(qiáng)的依賴。打包時(shí)通常會包含該依賴,部署時(shí)會打包到 lib 目錄下。比如:spring-core 這些核心的 jar 包。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

test(測試)

scope 為 test 表示依賴項(xiàng)目僅參與測試環(huán)節(jié),在編譯、運(yùn)行、打包時(shí)不會使用。最常見的使用就是單元測試類了:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

類似單元測試這樣的依賴,如果不設(shè)置 scope 為 test,很顯然它們會被打包、發(fā)布,但其實(shí)真是環(huán)境中并無什么作用。

runntime(運(yùn)行時(shí))

runntime 僅僅適用于運(yùn)行和測試環(huán)節(jié),在編譯環(huán)境下不會被使用。比如編譯時(shí)只需要 JDBC API 的 jar,而只有運(yùn)行時(shí)才需要 JDBC 驅(qū)動實(shí)現(xiàn)。

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.20</version>
  <scope>runtime</scope>
</dependency>

provided(已提供)

provided 適合在編譯和測試的環(huán)境,和 compile 功能相似,但 provide 僅在編譯和測試階段生效,provide 不會被打包,也不具有傳遞性。

比如:上面講到的 spring-boot-devtools、servlet-api 等,前者是因?yàn)椴恍枰谏a(chǎn)中熱部署,后者是因?yàn)槿萜饕呀?jīng)提供,不需要重復(fù)引入。

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <scope>provided</scope>
</dependency>

system

system 范圍依賴與 provided 類似,不過依賴項(xiàng)不會從 maven 倉庫獲取,而需要從本地文件系統(tǒng)提供。使用時(shí),一定要配合 systemPath 屬性。不推薦使用,盡量從 Maven 庫中引用依賴。

<dependency>
 <groupId>sun.jdk</groupId>
 <artifactId>tools</artifactId>
 <version>1.5.0</version>
 <scope>system</scope>
 <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

scope 依賴的傳遞性

上面講解 scope 的不同參數(shù)值,針對這些參數(shù)值,在多個(gè)項(xiàng)目中的依賴傳遞性如下:

其中 B 依賴 A,C 依賴 B,傳遞性的關(guān)鍵是 B 依賴 A 時(shí)所設(shè)置的 scope 值,當(dāng) B 采用不同的值時(shí)對應(yīng)的依賴關(guān)系如下:當(dāng) B 通過 test 或 provided 依賴 A 時(shí),C 不依賴 A;當(dāng) B 通過 runtime 或 compile 依賴 A 時(shí),C 依賴 A;

小結(jié)

經(jīng)過上面對 Maven 的 optional 和 scope 元素的詳細(xì)講解,想必你已經(jīng)可以對項(xiàng)目中的配置進(jìn)行排查,確保精確的使用項(xiàng)目與項(xiàng)目之間的依賴,而不是每個(gè)項(xiàng)目都引入大而全的依賴文件,導(dǎo)致項(xiàng)目臃腫,編譯緩慢,沖突不斷。

到此這篇關(guān)于Maven中optional和scope元素的使用弄明白了嗎的文章就介紹到這了,更多相關(guān)Maven optional scope 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java圖像處理之RGB調(diào)色面板

    Java圖像處理之RGB調(diào)色面板

    這篇文章主要為大家詳細(xì)介紹了Java圖像處理之RGB調(diào)色面板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java 非阻塞I/O使用方法

    Java 非阻塞I/O使用方法

    這篇文章主要介紹了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的簡介,同時(shí)向大家展示了利用非阻塞I/O實(shí)現(xiàn)客戶端的方法,需要的朋友可以參考下。
    2017-09-09
  • JAVA?module-info.java文件詳解

    JAVA?module-info.java文件詳解

    這篇文章主要介紹了JAVA?module-info.java文件詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    本篇文章是對Synchronized和java.util.concurrent.locks.Lock的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • spring mvc中注解@ModelAttribute的妙用分享

    spring mvc中注解@ModelAttribute的妙用分享

    這篇文章主要給大家介紹了關(guān)于spring mvc中注解@ModelAttribute妙用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-09-09
  • 利用反射實(shí)現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能

    利用反射實(shí)現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能

    將Excel或CSV文件轉(zhuǎn)換為Java對象(POJO)以及將Java對象轉(zhuǎn)換為Excel或CSV文件可能是一個(gè)復(fù)雜的過程,但如果使用正確的工具和技術(shù),這個(gè)過程就會變得十分簡單,在本文中,我們將了解如何利用一個(gè)Java反射的庫來實(shí)現(xiàn)這個(gè)功能,需要的朋友可以參考下
    2023-11-11
  • 解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題

    解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題

    這篇文章主要介紹了解決eclipse中maven引用不到已經(jīng)存在maven中jar包的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java?easyexcel使用教程之導(dǎo)出篇

    Java?easyexcel使用教程之導(dǎo)出篇

    EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡單,節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于Java?easyexcel使用教程之導(dǎo)出篇的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • java冒泡排序算法代碼

    java冒泡排序算法代碼

    這篇文章介紹了java冒泡排序算法代碼,有需要的朋友可以參考一下
    2013-10-10
  • java中PreparedStatement和Statement詳細(xì)講解

    java中PreparedStatement和Statement詳細(xì)講解

    這篇文章主要介紹了java中PreparedStatement和Statement詳細(xì)講解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

龙山县| 通海县| 皋兰县| 富源县| 永年县| 嘉峪关市| 尼玛县| 山丹县| 上饶市| 仁布县| 视频| 吉水县| SHOW| 达尔| 克什克腾旗| 平顶山市| 三亚市| 澄城县| 儋州市| 翁源县| 荆门市| 怀仁县| 和静县| 陆川县| 突泉县| 黎平县| 昌宁县| 湖州市| 高安市| 曲水县| 株洲县| 庆阳市| 介休市| 龙岩市| 慈利县| 府谷县| 东宁县| 黄山市| 南安市| 进贤县| 分宜县|