Maven中dependency標(biāo)簽參數(shù)的使用小結(jié)
Maven中dependency標(biāo)簽參數(shù)如下:
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<optional></optional>
<scope></scope>
<classifier></classifier>
<systemPath></systemPath>
<exclusions></exclusions>
</dependency>一、type
有時(shí)候我們引入某一個(gè)依賴時(shí),必須指定type,這是因?yàn)橛糜谄ヅ鋎ependency引用和dependencyManagement部分的最小信息集實(shí)際上是{groupId,artifactId,type,classifier}。在很多情況下,這些依賴關(guān)系將引用沒有classifier的jar依賴。這允許我們將標(biāo)識設(shè)置為{groupId,artifactId},因?yàn)閠ype的默認(rèn)值是jar,并且默認(rèn)classifier為null。
type的值一般有jar、war、pom等,聲明引入的依賴的類型。
二、classifier
Classifier可能是最容易被忽略的Maven特性,但它確實(shí)非常重要,我們也需要它來幫助規(guī)劃坐標(biāo)。設(shè)想這樣一個(gè)情況,有一個(gè)jar項(xiàng)目,就說是 dog-cli-1.0.jar 吧,運(yùn)行它用戶就能在命令行上畫一只小狗出來?,F(xiàn)在用戶的要求是希望你能提供一個(gè)zip包,里面不僅包含這個(gè)可運(yùn)行的jar,還得包含源代碼和文檔,換句話說,這是比較正式的分發(fā)包。這個(gè)文件名應(yīng)該是怎樣的呢?dog-cli-1.0.zip?不夠清楚,僅僅從擴(kuò)展名很難分辨什么是Maven默認(rèn)生成的構(gòu)件,什么是額外配置生成分發(fā)包。如果能是dog-cli-1.0-dist.zip就最好了。這里的dist就是classifier,默認(rèn)Maven只生成一個(gè)構(gòu)件,我們稱之為主構(gòu)件,那當(dāng)我們希望Maven生成其他附屬構(gòu)件的時(shí)候,就能用上classifier。常見的classifier還有如dog-cli-1.0-sources.jar表示源碼包,dog-cli-1.0-javadoc.jar表示JavaDoc包等等。
classifier它表示在相同版本下針對不同的環(huán)境或者jdk使用的jar,如果配置了這個(gè)元素,則會(huì)將這個(gè)元素名在加在最后來查找相應(yīng)的jar,例如:
上面的例子 <classifier>sources</classifier> <classifier>javadoc</classifier>
給相同的version,構(gòu)建不同的環(huán)境使用依賴 <classifier>jdk17</classifier> <classifier>jdk18</classifier>
三、optional
當(dāng)project-A 依賴project-B, project-B 依賴project-D時(shí)
<dependency> <groupId>sample.ProjectD</groupId> <artifactId>ProjectD</artifactId> <version>1.0-SNAPSHOT</version> <optional>true</optional> </dependency>
所以當(dāng)project-B的true時(shí), project-A中如果沒有顯式的引入project-D, 則project-A不依賴project-D, 即project-A可以自己選擇是否依賴project-D
默認(rèn)的值為false, 及子項(xiàng)目必須依賴。
四、scope
scope的分類:
compile
默認(rèn)就是compile,什么都不配置也就是意味著compile。compile表示被依賴項(xiàng)目需要參與當(dāng)前項(xiàng)目的編譯,當(dāng)然后續(xù)的測試,運(yùn)行周期也參與其中,是一個(gè)比較強(qiáng)的依賴。打包的時(shí)候通常需要包含進(jìn)去。
test
scope為test表示依賴項(xiàng)目僅僅參與測試相關(guān)的工作,包括測試代碼的編譯,執(zhí)行。比較典型的如junit。
runntime
runntime表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯,不過后期的測試和運(yùn)行周期需要其參與。與compile相比,跳過編譯而已,說實(shí)話在終端的項(xiàng)目(非開源,企業(yè)內(nèi)部系統(tǒng))中,和compile區(qū)別不是很大。比較常見的如JSR×××的實(shí)現(xiàn),對應(yīng)的API jar是compile的,具體實(shí)現(xiàn)是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅(qū)動(dòng)架包就是一個(gè)很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實(shí)現(xiàn),也可以用B實(shí)現(xiàn)。
provided
provided意味著打包的時(shí)候可以不用包進(jìn)去,別的設(shè)施(Web
Container)會(huì)提供。事實(shí)上該依賴?yán)碚撋峡梢詤⑴c編譯,測試,運(yùn)行等周期。相當(dāng)于compile,但是在打包階段做了exclude的動(dòng)作。
system
從參與度來說,也provided相同,不過被依賴項(xiàng)不會(huì)從maven倉庫抓,而是從本地文件系統(tǒng)拿,一定需要配合systemPath屬性使用。
import(only available in Maven 2.0.9 or later)
這個(gè)是maven2.0.9版本后出的屬性,import只能在dependencyManagement的中使用,能解決maven單繼承問題,import依賴關(guān)系實(shí)際上并不參與限制依賴關(guān)系的傳遞性。
使用import scope解決maven繼承(單)問題
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時(shí),C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承于B的scope。
五、systemPath
當(dāng)maven依賴本地而非repository中的jar包,sytemPath指明本地jar包路徑,例如:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systemPath>
</dependency>六、exclusions
依賴排除,就是有時(shí)候引入某一個(gè)依賴的時(shí)候,該依賴下有jar包沖突,可以排除掉,不引用該jar,例如:
<dependency>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0.2-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>到此這篇關(guān)于Maven中dependency標(biāo)簽參數(shù)的使用小結(jié)的文章就介紹到這了,更多相關(guān)Maven dependency標(biāo)簽參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用
這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
SpringBoot中排查內(nèi)存泄漏的方法小結(jié)
內(nèi)存泄漏是項(xiàng)目開發(fā)中常見且棘手的問題,它會(huì)導(dǎo)致應(yīng)用性能下降、響應(yīng)變慢,嚴(yán)重時(shí)甚至?xí)l(fā)OutOfMemoryError異常導(dǎo)致應(yīng)用崩潰,下面我們就來看看SpringBoot排查內(nèi)存泄漏的常用方法吧2025-06-06
java8時(shí)間間隔類Duration和Period示例代碼
文章解釋了Java中Duration和Period的區(qū)別,并提供了它們的特點(diǎn)、適用場景和常見用途,文中還提供了每個(gè)類的常用方法和示例,感興趣的朋友一起看看吧2026-04-04
Java 中Timer和TimerTask 定時(shí)器和定時(shí)任務(wù)使用的例子
這篇文章主要介紹了Java 中Timer和TimerTask 定時(shí)器和定時(shí)任務(wù)使用的例子,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
一篇文章帶你了解一些Java反射的學(xué)習(xí)記錄
java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來寫操做數(shù)據(jù)庫的代碼了,這個(gè)可以很大的減少開發(fā)時(shí)間,而且代碼的可讀性好2021-09-09
Java視頻格式轉(zhuǎn)化的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Java視頻格式轉(zhuǎn)化的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Mybatis實(shí)現(xiàn)SQL映射的兩種方法(xml文件形式和注解形式)
這篇文章主要介紹了Mybatis實(shí)現(xiàn)SQL映射的兩種方法(xml文件形式和注解形式),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

