Maven dependency中的scope案例講解
Maven的一個哲學(xué)是慣例優(yōu)于配置(Convention Over Configuration), Maven默認(rèn)的依賴配置項(xiàng)中,scope的默認(rèn)值是compile。
scope的分類
compile(默認(rèn))
含義: compile 是默認(rèn)值,如果沒有指定 scope 值,該元素的默認(rèn)值為 compile。被依賴項(xiàng)目需要參與到當(dāng)前項(xiàng)目的編譯,測試,打包,運(yùn)行等階段。打包的時候通常會包含被依賴項(xiàng)目。
provided
provided意味著打包的時候可以不用包進(jìn)去,別的設(shè)施(Web Container)會提供。事實(shí)上該依賴?yán)碚撋峡梢詤⑴c編譯,測試,運(yùn)行等周期。相當(dāng)于compile,但是在打包階段做了exclude的動作。
含義:被依賴項(xiàng)目理論上可以參與編譯、測試、運(yùn)行等階段,相當(dāng)于compile,但是再打包階段做了exclude的動作。
適用場景:例如, 如果我們在開發(fā)一個web 應(yīng)用,在編譯時我們需要依賴 servlet-api.jar,但是在運(yùn)行時我們不需要該 jar 包,因?yàn)檫@個 jar 包已由應(yīng)用服務(wù)器提供,此時我們需要使用 provided 進(jìn)行范圍修飾。
runtime
runntime表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯,不過后期的測試和運(yùn)行周期需要其參與。
含義:表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯,但是會參與到項(xiàng)目的測試和運(yùn)行。與compile相比,被依賴項(xiàng)目無需參與項(xiàng)目的編譯。
適用場景:例如,在編譯的時候我們不需要 JDBC API 的 jar 包,而在運(yùn)行的時候我們才需要 JDBC 驅(qū)動包。
test
含義: 表示被依賴項(xiàng)目僅僅參與測試相關(guān)的工作,包括測試代碼的編譯,執(zhí)行。
適用場景:例如,Junit 測試。
system
含義:system 元素與 provided 元素類似,但是被依賴項(xiàng)不會從 maven 倉庫中查找,而是從本地系統(tǒng)中獲取,systemPath 元素用于制定本地系統(tǒng)中 jar 文件的路徑。例如:
<dependency>
<groupId>org.open</groupId>
<artifactId>open-core</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath>
</dependency>import
它只使用在<dependencyManagement>中,表示從其它的pom中導(dǎo)入dependency的配置,例如 (B項(xiàng)目導(dǎo)入A項(xiàng)目中的包配置):
想必大家在做SpringBoot應(yīng)用的時候,都會有如下代碼:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>繼承一個父模塊,然后再引入相應(yīng)的依賴。
假如說,我不想繼承,或者我想繼承多個,怎么做?
我們知道Maven的繼承和Java的繼承一樣,是無法實(shí)現(xiàn)多重繼承的,如果10個、20個甚至更多模塊繼承自同一個模塊,那么按照我們之前的做法,這個父模塊的dependencyManagement會包含大量的依賴。如果你想把這些依賴分類以更清晰的管理,那就不可能了,import scope依賴能解決這個問題。你可以把dependencyManagement放到單獨(dú)的專門用來管理依賴的pom中,然后在需要使用依賴的模塊中通過import scope依賴,就可以引入dependencyManagement。例如可以寫這樣一個用于依賴管理的pom:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.sample</groupId>
<artifactId>base-parent1</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>然后我就可以通過非繼承的方式來引入這段依賴管理配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.test.sample</groupId>
<artifactid>base-parent1</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>注意:import scope只能用在<dependencyManagement>里面
這樣,父模塊的pom就會非常干凈,由專門的packaging為pom來管理依賴,也契合的面向?qū)ο笤O(shè)計(jì)中的單一職責(zé)原則。此外,我們還能夠創(chuàng)建多個這樣的依賴管理pom,以更細(xì)化的方式管理依賴。這種做法與面向?qū)ο笤O(shè)計(jì)中使用組合而非繼承也有點(diǎn)相似的味道。
那么,如何用這個方法來解決SpringBoot的那個繼承問題呢?
配置如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>這樣配置的話,自己的項(xiàng)目里面就不需要繼承SpringBoot的module了,而可以繼承自己項(xiàng)目的module了。
scope的依賴傳遞
A–>B–>C。當(dāng)前項(xiàng)目為A,A依賴于B,B依賴于C。知道B在A項(xiàng)目中的scope,那么怎么知道C在A中的scope呢?
答案是:
當(dāng)C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承于B的scope。
下面是一張nexus畫的圖。

到此這篇關(guān)于Maven dependency中的scope的文章就介紹到這了,更多相關(guān)Maven dependency中的scope內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Maven dependency:tree 的 8 個高級用法
- Maven dependencyManagement元素標(biāo)簽的具體使用
- Maven中的dependencyManagement 實(shí)例詳解
- Maven中dependencyManagement管理項(xiàng)目依賴項(xiàng)
- Maven?dependency?plugin使用心得總結(jié)
- Maven中dependency和plugins的繼承與約束
- Maven dependencies與dependencyManagement的區(qū)別詳解
- Maven中dependency標(biāo)簽參數(shù)的使用小結(jié)
相關(guān)文章
SpringBoot實(shí)現(xiàn)MQTT消息發(fā)送和接收方式
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)MQTT消息發(fā)送和接收方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
通過Java實(shí)現(xiàn)zip文件與rar文件解壓縮的詳細(xì)步驟
這篇文章主要給大家介紹了如何通過?Java?來完成?zip?文件與?rar?文件的解壓縮,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07
java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實(shí)例代碼詳解)
這篇文章主要介紹了java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
SpringBoot集成Knife4j/Swagger:接口文檔自動生成,告別手寫API文檔
本文將詳細(xì)講解SpringBoot如何快速集成Knife4j/Swagger,從環(huán)境搭建、基礎(chǔ)配置、接口注解使用,到進(jìn)階優(yōu)化,全程附完整代碼示例,感興趣的朋友跟隨小編一起看看吧2026-03-03
詳解Spring cloud使用Ribbon進(jìn)行Restful請求
這篇文章主要介紹了詳解Spring cloud使用Ribbon進(jìn)行Restful請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
java+jsp+struts2實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了java+jsp+struts2實(shí)現(xiàn)發(fā)送郵件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03

