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。

Tags: