Maven依賴和衝突
- 2019 年 11 月 3 日
- 筆記
maven的核心就是依賴管理,在模組過多,之間的依賴關係也很複雜,maven提高了一個高效的管理方法。
<dependency> <groupId>工程組唯一標識</groupId> <artifactId>工程唯一標識</artifactId> <version>版本</version> <scope>依賴範圍</scope> <optional>依賴可選</optional> <exclusions> <exclusion> <!-- 排除jar --> <groupId>com.alibaba</groupId> <artifactId>jconsole</artifactId> <!--注意這裡沒有寫版本--> </exclusion> </exclusions> </dependency>
當A 依賴 B ,B 依賴C。 其中C是通過依賴傳遞給A,A中是有C的。 其中A不想依賴C 可以使用<exclusion>(不指定版本)或者<optional>(默認值false)
- scope取值: compile、provided、test、runtime、system、import
取值 | 範圍 | 描述 |
|---|---|---|
compile | 默認值,編譯時、測試、運行 | 當前項目的類路徑下有效 |
provided | 編譯、測試 | 由運行時JDK或者容器(Idea)提供 |
test | 測試,運行 | 只在測試編譯執行階段 |
runtime | 運行時 | 在編譯時不是必須的,執行時必須。類似JDBC |
system | 編譯測試 | 從本地系統指定路徑獲取systemPath |
import | 導入階段 | 只用在dependencyManagement中,和<type>pom</type>配合使用 |
- 依賴衝突
依賴衝突產生的原因:就像A引入了B和C,但是在B和C中都依賴了D,B依賴的D的1.0版本,C依賴了D的1.1版本。這是兩個版本的D就有可能出現衝突,為什麼是有可能? 因為依賴管理是根據兩個版本的深度和誰先聲明,來決定選誰。 比如: A->B->D(1.0) A->C->E->D(1.1) 這時A就會選擇D(1.0); 如果路徑相同誰先聲明使用誰。
依賴衝突大多場景:NoSuchMethod、NotFoundClass,方法類不一致。 解決方式:mvn denpendency:treee -->tree.tex 在當前目錄列印出maven 依賴樹生成tree.txt 文件,找出衝突的jar。
如何避免依賴衝突:項目中依賴的jar都有父POM < dependencyManagement>管理,其他模組使用import。

