排查maven 沖突及解決方式
Maven
Maven 是一個以項目為中心的自動化構建工具,主要用于Java項目的管理和構建。它提供了一種統(tǒng)一的方式來描述項目的結構、依賴關系和構建過程,簡化了項目的構建和管理。
Maven 的主要特點:
- 項目對象模型(POM):Maven 使用
pom.xml文件來定義項目的依賴、插件和構建配置。POM 是 Maven 項目的核心,描述了項目的基本信息。 - 依賴管理:Maven 允許開發(fā)者輕松地管理項目所需的庫和框架。通過聲明依賴,Maven 會自動下載所需的庫及其依賴項,解決版本沖突。
- 插件體系:Maven 提供了豐富的插件,可以在構建過程中執(zhí)行各種任務,例如編譯代碼、打包、運行測試等。
- 生命周期管理:Maven 通過定義項目的生命周期來規(guī)范構建過程,主要包含清理、編譯、測試、打包、部署等階段。
- 多模塊項目支持:Maven 支持多模塊項目,允許將相關模塊組織在同一個項目結構中,方便管理和構建。
- 社區(qū)支持:Maven 擁有龐大的社區(qū)支持,提供了大量的插件和資源,幫助開發(fā)者高效開展工作。
1. 常見的依賴沖突報錯
1.1、版本沖突報錯:
[WARNING] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[WARNING]
[WARNING] org.apache.commons:commons-lang3:jar:3.4 is referenced from more than one dependency.
[WARNING] - org.apache.commons:commons-lang3:jar:3.4 (compile)
[WARNING] - org.apache.commons:commons-lang3:jar:3.5 (compile)
1.2、類找不到或方法找不到:
NoClassDefFoundError 或者 ClassNotFoundException或者 NoSuchMethodException
常見但不僅限于以下異常:
java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
或者
java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.isBlank(Ljava/lang/CharSequence;
NoSuchMethodException
依賴沖突可能會間接導致 NoSuchMethodException。例如:
不同版本的庫:如果項目中引入了同一庫的不同版本,Maven 可能會選擇一個版本,而這個版本中可能缺少某些方法,從而在運行時導致 NoSuchMethodException。
依賴傳遞:某些依賴可能會引入其他庫的特定版本,如果這些版本之間存在不兼容的方法,也可能導致 NoSuchMethodException。
1.3、依賴樹中的沖突:
例如:
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.3.4.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.3.4.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:2.3.4.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.3.4.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.3.4.RELEASE:compile
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] | | | | +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] | | | | \- org.slf4j:slf4j-api:jar:1.7.30:compile
[INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.13.3:compile
[INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.13.3:compile
[INFO] | | | \- org.slf4j:jul-to-slf4j:jar:1.7.30:compile
[INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[INFO] | | +- org.springframework:spring-core:jar:5.2.9.RELEASE:compile
[INFO] | | | \- org.springframework:spring-jcl:jar:5.2.9.RELEASE:compile
2、排查maven 依賴是否沖突
2.1、pom 依賴,這里展示部分依賴進行拆解

2.2、使用idea 自帶工具進行排查分析:紅色的線就表示沖突了。

2.3、使用工具 :maven helper
首先我使用的idea工具,可以安裝插件maven helper,

2.4、重啟idea
這玩意裝好,我們關閉窗口,有可能會叫你restart一下,你就乖乖聽話。之后我們打開pom文件并且點擊依賴分析。切換到:Dependency Analyzer

3、分析沖突
3.1、點擊右鍵---》Jump to Source 就會跳回到自己的pom 文件(我這跳轉到 56 行)

這個時候我們可以一直向下點擊,去看 mybatis 3.5.14 依賴路徑和 mybatis 3.5.15 沖突依賴路徑版本

4、解決辦法
總共有四種解決方式:
1,第一聲明優(yōu)先原則
在pom.xml配置文件中,如果有兩個名稱相同版本不同的依賴聲明,那么先寫的會生效(同個pom.xml文件)。
所以,先聲明自己要用的版本的jar包即可。
2,路徑近者優(yōu)先
直接依賴優(yōu)先于傳遞依賴,如果傳遞依賴的jar包版本沖突了,那么可以自己聲明一個指定版本的依賴jar,即可解決沖突。
3,排除原則
傳遞依賴沖突時,可以在不需要的jar的傳遞依賴中聲明排除,從而解決沖突。

在pom 文件就會自動生成 排除標識
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
<!-- 排除掉 沖突的 mybatis(3.5.15) -->
<exclusions>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
結果:

刷新:先返回去pom 點擊刷新,然后在 maven help 里面點擊 Refresh UI


最后依賴沖突只剩三個

4,版本鎖定原則
在配置文件pom.xml中先聲明要使用哪個版本的相應jar包,聲明后其他版本的jar包一律不依賴。解決了依賴沖突。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.14</version>
</dependency>
</dependencies>
</dependencyManagement>
結果:依舊可以排除掉依賴沖突

最后文章有啥不對,歡迎大佬指點!!!
如果感覺對你有幫助就點贊推薦或者關注一下吧!!!


浙公網安備 33010602011771號