Maven依賴(lài)中scope的含義
scope元素的作用:控制 dependency 元素的使用范圍。通俗的講,就是控制 jar 包在哪些范圍被加載和使用。
scope具體含義如下:
compile(默認(rèn))
含義:compile 是默認(rèn)值,如果沒(méi)有指定 scope 值,該元素的默認(rèn)值為 compile。被依賴(lài)項(xiàng)目需要參與到當(dāng)前項(xiàng)目的編譯,測(cè)試,打包,運(yùn)行等階段。打包的時(shí)候通常會(huì)包含被依賴(lài)項(xiàng)目。
provided
含義:被依賴(lài)項(xiàng)目理論上可以參與編譯、測(cè)試、運(yùn)行等階段,相當(dāng)于compile,但是再打包階段做了exclude的動(dòng)作。
適用場(chǎng)景:例如, 如果我們?cè)陂_(kāi)發(fā)一個(gè)web 應(yīng)用,在編譯時(shí)我們需要依賴(lài) servlet-api.jar,但是在運(yùn)行時(shí)我們不需要該 jar 包,因?yàn)檫@個(gè) jar 包已由應(yīng)用服務(wù)器提供,此時(shí)我們需要使用 provided 進(jìn)行范圍修飾。
runtime
含義:表示被依賴(lài)項(xiàng)目無(wú)需參與項(xiàng)目的編譯,但是會(huì)參與到項(xiàng)目的測(cè)試和運(yùn)行。與compile相比,被依賴(lài)項(xiàng)目無(wú)需參與項(xiàng)目的編譯。
適用場(chǎng)景:例如,在編譯的時(shí)候我們不需要 JDBC API 的 jar 包,而在運(yùn)行的時(shí)候我們才需要 JDBC 驅(qū)動(dòng)包。
test
含義: 表示被依賴(lài)項(xiàng)目?jī)H僅參與測(cè)試相關(guān)的工作,包括測(cè)試代碼的編譯,執(zhí)行。
適用場(chǎng)景:例如,Junit 測(cè)試。
system
含義:system 元素與 provided 元素類(lèi)似,但是被依賴(lài)項(xiàng)不會(huì)從 maven 倉(cāng)庫(kù)中查找,而是從本地系統(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)用的時(shí)候,都會(huì)有如下代碼:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent>
繼承一個(gè)父模塊,然后再引入相應(yīng)的依賴(lài)。
假如說(shuō),我不想繼承,或者我想繼承多個(gè),怎么做?
我們知道Maven的繼承和Java的繼承一樣,是無(wú)法實(shí)現(xiàn)多重繼承的,如果10個(gè)、20個(gè)甚至更多模塊繼承自同一個(gè)模塊,那么按照我們之前的做法,這個(gè)父模塊的dependencyManagement會(huì)包含大量的依賴(lài)。如果你想把這些依賴(lài)分類(lèi)以更清晰的管理,那就不可能了,import scope依賴(lài)能解決這個(gè)問(wèn)題。你可以把dependencyManagement放到單獨(dú)的專(zhuān)門(mén)用來(lái)管理依賴(lài)的pom中,然后在需要使用依賴(lài)的模塊中通過(guò)import scope依賴(lài),就可以引入dependencyManagement。例如可以寫(xiě)這樣一個(gè)用于依賴(lài)管理的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>
然后我就可以通過(guò)非繼承的方式來(lái)引入這段依賴(lài)管理配置
<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就會(huì)非常干凈,由專(zhuān)門(mén)的packaging為pom來(lái)管理依賴(lài),也契合的面向?qū)ο笤O(shè)計(jì)中的單一職責(zé)原則。此外,我們還能夠創(chuàng)建多個(gè)這樣的依賴(lài)管理pom,以更細(xì)化的方式管理依賴(lài)。這種做法與面向?qū)ο笤O(shè)計(jì)中使用組合而非繼承也有點(diǎn)相似的味道。
那么,如何用這個(gè)方法來(lái)解決SpringBoot的那個(gè)繼承問(wèn)題呢?
配置如下:
<dependencyManagement> ? ? <dependencies> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? ? ? ? <artifactId>spring-boot-dependencies</artifactId> ? ? ? ? ? ? <version>1.3.3.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>
這樣配置的話(huà),自己的項(xiàng)目里面就不需要繼承SpringBoot的module了,而可以繼承自己項(xiàng)目的module了。
scope的依賴(lài)傳遞
A–>B–>C。當(dāng)前項(xiàng)目為A,A依賴(lài)于B,B依賴(lài)于C。知道B在A(yíng)項(xiàng)目中的scope,那么怎么知道C在A(yíng)中的scope呢?答案是:
當(dāng)C是test或者provided時(shí),C直接被丟棄,A不依賴(lài)C;
否則A依賴(lài)C,C的scope繼承于B的scope。
下面是一張nexus畫(huà)的圖。
到此這篇關(guān)于Maven依賴(lài)中scope的含義的文章就介紹到這了,更多相關(guān)Maven scope內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA開(kāi)發(fā)環(huán)境Vs?code配置步驟詳解
這篇文章主要為大家介紹了JAVA開(kāi)發(fā)環(huán)境Vs?code配置步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04淺談java中守護(hù)線(xiàn)程與用戶(hù)線(xiàn)程
本篇文章主要介紹了淺談java中守護(hù)線(xiàn)程與用戶(hù)線(xiàn)程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09java面試常見(jiàn)問(wèn)題之Hibernate總結(jié)
這篇文章主要介紹了在java面試過(guò)程中hibernate比較常見(jiàn)的問(wèn)題,包括Hibernate的檢索方式,Hibernate中對(duì)象的狀態(tài),Hibernate的3種檢索策略是什么,Session的find()方法以及Query接口的區(qū)別等方面問(wèn)題的總結(jié),需要的朋友可以參考下2015-07-07Redis工具類(lèi)封裝RedisUtils的使用示例
本文主要介紹了Redis工具類(lèi)封裝RedisUtils的使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03SpringBoot整合XxlJob分布式任務(wù)調(diào)度平臺(tái)
xxl-job是一個(gè)開(kāi)源的分布式定時(shí)任務(wù)框架,它可以與其他微服務(wù)組件一起構(gòu)成微服務(wù)集群。它的調(diào)度中心(xxl-job)和執(zhí)行器(自己的springboot項(xiàng)目中有@XxlJob("定時(shí)任務(wù)名稱(chēng)")的方法)是相互分離,分開(kāi)部署的,兩者通過(guò)HTTP協(xié)議進(jìn)行通信2023-02-02淺談springmvc的DispatcherServlet分析
本篇文章主要介紹了淺談springmvc的DispatcherServlet分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Java使用DFA算法實(shí)現(xiàn)敏感詞過(guò)濾的示例代碼
很多項(xiàng)目中都會(huì)有一個(gè)敏感詞管理模塊,本文主要介紹了Java使用DFA算法實(shí)現(xiàn)敏感詞過(guò)濾的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03