關(guān)于依賴管理
坐標(biāo)和 mvnrepository 網(wǎng)站
在 maven 中通過(guò)『坐標(biāo)』概念來(lái)確定一個(gè)唯一確定的 jar 包。坐標(biāo)的組成部分有:
元素 | 說(shuō)明 |
---|---|
<groupId> | 定義當(dāng)前 Maven 組織名稱 |
<artifactId> | 定義實(shí)際項(xiàng)目名稱 |
<version> | 定義當(dāng)前項(xiàng)目的當(dāng)前版本 |
[?] 注意
任意兩個(gè)不同包,它們的這三個(gè)屬性必定至少有一項(xiàng)是不同的。即,三者的「組合」必須唯一。
那么如何確定一個(gè) java 包的坐標(biāo)?通過(guò) https://mvnrepository.com 。
mvnrepository 是一個(gè)與中央倉(cāng)庫(kù)對(duì)應(yīng)的查詢系統(tǒng)。在這里你可以查詢你所需要的 java 包的坐標(biāo)。
你只需要復(fù)制粘貼你所查到的 java 包的坐標(biāo) <repository> 片段即可。
pom.xml 中"引"包
「依賴管理」就是對(duì)項(xiàng)目中 jar 包的管理??梢栽?pom.xml 文件中定義 jar 包的坐標(biāo),管理依賴。
整體結(jié)構(gòu)(其它無(wú)關(guān)元素略):
project
└── dependencies
├── dependency
├── dependency
├── ...
└── dependency
例如:
<dependencies>
<!--slf4j-api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!--slf4j-simple-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<dependency> ... </dependency>
<dependency> ... </dependency>
<dependency> ... </dependency>
</dependencies>
maven 項(xiàng)目會(huì)「引用」你本地倉(cāng)庫(kù)中的這些 java 包。理論上,你的本地倉(cāng)庫(kù)「應(yīng)該有」這些包,如果沒(méi)有,maven 會(huì)先從網(wǎng)絡(luò)倉(cāng)庫(kù)中下載它們。如果網(wǎng)絡(luò)倉(cāng)庫(kù)也沒(méi)有,那么 maven 會(huì)報(bào)錯(cuò)。
這些 java 庫(kù)在本地倉(cāng)庫(kù)的存放的路徑規(guī)則是:
%homepath%/.m2/repository/<groupId>/<artifactId>/<version>
例如,上面的 slf4j-api 在本地倉(cāng)庫(kù)中的存放路徑就是
C:\Users\hello world\.m2\repository\org\slf4j\slf4j-api\1.7.25
[?] 注意
需要注意的是,maven 項(xiàng)目是在「引用」這些 java 庫(kù)。在項(xiàng)目最終打包前,你的 maven 項(xiàng)目中并沒(méi)有真正地「包含」這些 java 包,你會(huì)發(fā)現(xiàn)無(wú)論你「引用」多少 java 包,你的項(xiàng)目源碼的文件夾大小實(shí)際上并沒(méi)有增加(其中只有你的項(xiàng)目源碼)。maven 就是通過(guò)這種方式來(lái)節(jié)約空間。
依賴范圍
依賴范圍 (Scope) |
對(duì) main classpath 有效 | 對(duì) test classpath 有效 | 打入包中 | 例子 |
---|---|---|---|---|
compile | Yes | Yes | Yes | log4j |
test | - | Yes | - | junit |
privided | Yes | Yes | - | servlet-api |
runtime | - | - | Yes | jdbc 驅(qū)動(dòng)實(shí)現(xiàn)類 |
使用技巧:
-
compile 是
<scope>
的默認(rèn)值; - 錯(cuò)將 runtime 寫(xiě)成 compile ,對(duì)項(xiàng)目無(wú)影響;
- 錯(cuò)將 test 寫(xiě)成 compile ,對(duì)項(xiàng)目無(wú)太大影響。不影響項(xiàng)目運(yùn)行,僅僅是項(xiàng)目的 jar/war 包會(huì)變大;
- 唯一需要仔細(xì)思考、分辨的是 provided 。如果 provided 被誤寫(xiě)成了 compile 會(huì)導(dǎo)致項(xiàng)目發(fā)布運(yùn)行時(shí)因?yàn)榘鼪_突而無(wú)法運(yùn)行,或出現(xiàn) bug 。
[!attention] 注意
你需要留意、甚至記憶哪些包應(yīng)該是 provided 的。
依賴傳遞
<dependencies>
<!--
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<dependencies>
前面的這個(gè)依賴可以將 slf4j-api
去掉,也依然可行。原因在于,雖然我們沒(méi)有聲明引用、使用 lslf4j-api
,但是我們聲明要引用、使用的 slf4j-simple
它要使用 slf4j-api
,因此,maven 仍然還是會(huì)把 slf4j-api
納入我們的項(xiàng)目中。
[?] 我們?nèi)绾沃?slf4j-simple 它會(huì)使用 slf4j-api ?
有兩種方式:
-
在 mvnrepository.com 中查詢 slf4j-simple 時(shí),該網(wǎng)站上會(huì)列出它所依賴的其它的包(如果有的話)。
-
開(kāi)發(fā)工具會(huì)有圖形化界面讓你能看到包的依賴關(guān)系,你可以直觀地看到,slf4j-simple 依賴于 slf4j-api 。這樣你可以對(duì)你的 repositories 進(jìn)行優(yōu)化。
依賴沖突
依賴沖突指的是你的項(xiàng)目中「包含了同一個(gè)包的兩個(gè)不同版本」。這種情況下通常會(huì)導(dǎo)致項(xiàng)目報(bào)錯(cuò),或啟動(dòng)失敗。
依賴沖突常見(jiàn)于兩個(gè)場(chǎng)景:
-
同一個(gè)項(xiàng)目的兩個(gè)開(kāi)發(fā)人員不約而同想到使用同一個(gè) java 庫(kù),而互相不知道。從而導(dǎo)致項(xiàng)目的 pom 中引入了同一個(gè)包的兩個(gè)不同版本。
-
項(xiàng)目依賴于 A 和 B 兩個(gè)庫(kù),看似沒(méi)有問(wèn)題,但是 B 庫(kù)本身又依賴于 A 庫(kù)(或者是,B 庫(kù)依賴于 C 庫(kù),而 C 庫(kù)依賴于 A 庫(kù))。從而導(dǎo)致項(xiàng)目中最終還是包含了 A 庫(kù)的兩個(gè)不同版本。
Maven 會(huì)自動(dòng)解決依賴沖突問(wèn)題,它基于 2 個(gè)原則來(lái)處理:
-
路徑最近者優(yōu)先
項(xiàng)目 A 有如下的依賴關(guān)系:
A -> B -> C -> X (1.0)
A -> D -> X (2.0)
maven 最終包含的會(huì)是 X 庫(kù)的 2.0 版本。
-
路徑相等,先聲明者優(yōu)先
項(xiàng)目 A 有如下的依賴關(guān)系:
A -> B -> Y(1.0)
A -> C -> Y(2.0)
若 pom 文件中 B 的依賴坐標(biāo)先于 C 進(jìn)行聲明,則最終 Y 的版本為 1.0 。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-658463.html
在開(kāi)發(fā)工具中,可以有圖形化界面讓你直觀地看到依賴關(guān)系,其中會(huì)將依賴沖突展示出來(lái)。IDEA 圖形化展示效果比 Eclipse 要更好。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-658463.html
到了這里,關(guān)于Maven 基礎(chǔ)之依賴管理、范圍、傳遞、沖突的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!