SpringBoot項(xiàng)目jar依賴問題報(bào)錯(cuò)解析
常見依賴錯(cuò)誤類型及報(bào)錯(cuò)內(nèi)容
1. 依賴沖突類錯(cuò)誤
(1) ClassNotFoundException(類找不到)
報(bào)錯(cuò)內(nèi)容:
java.lang.NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizer
原因:
- 依賴版本不一致,導(dǎo)致類找不到
- 項(xiàng)目中存在不同版本的同一個(gè)類
- 依賴沖突,如知識(shí)庫[3]中描述的"WebServerFactoryCustomizer這個(gè)類是2.x版本才存在"
典型場景:
- Spring Boot版本混亂
- 依賴庫版本不一致
(2) NoSuchMethodError(方法找不到)
報(bào)錯(cuò)內(nèi)容:
java.lang.NoSuchMethodError: org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory.addErrorPages(Ljava/util/List;)V
原因:
- 依賴版本不匹配,方法簽名不一致
- 不同版本的依賴庫之間存在方法差異
(3) ClassCastException(類型轉(zhuǎn)換異常)
報(bào)錯(cuò)內(nèi)容:
java.lang.ClassCastException: com.example.MyClass cannot be cast to com.example.MyClass
原因:
- 加載了不同版本的同一個(gè)類
- 類加載器隔離問題
(4) LinkageError(鏈接錯(cuò)誤)
報(bào)錯(cuò)內(nèi)容:
java.lang.LinkageError: loader 'app' attempted to load class 'com.example.MyClass' from both 'module1' and 'module2'
原因:
- 類被不同類加載器加載
- 依賴版本不一致導(dǎo)致類加載沖突
2. 依賴配置錯(cuò)誤
(1) 依賴坐標(biāo)錯(cuò)誤
報(bào)錯(cuò)內(nèi)容:
Could not find artifact com.zjbdos.cloud:zjbdos-cloud-framework-core:pom:1.0.0 in alimaven (http://maven.aliyun.com/nexus/content/groups/public/)
原因:
- 依賴坐標(biāo)(groupId、artifactId、version)錯(cuò)誤
- 倉庫地址配置錯(cuò)誤
- 依賴未發(fā)布到指定倉庫
解決方案:
- 確認(rèn)依賴坐標(biāo)正確
- 檢查倉庫配置
- 確認(rèn)依賴已發(fā)布到指定倉庫
(2) 依賴范圍配置錯(cuò)誤
報(bào)錯(cuò)內(nèi)容:
java.lang.NoClassDefFoundError: com.example.ThirdPartyClass
原因:
- 依賴范圍(scope)設(shè)置為
system,但未在打包插件中配置includeSystemScope - 依賴未被正確打包到最終的jar中
解決方案:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>3. 依賴傳遞沖突
(1) 依賴傳遞沖突
報(bào)錯(cuò)內(nèi)容:
java.lang.NoSuchMethodError: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.<init>(Lcom/baomidou/mybatisplus/core/parser/ISqlParser;)V
原因:
- 項(xiàng)目中引入了多個(gè)版本的MyBatis Plus
- 如知識(shí)庫[4]中描述:“zjbdos-cloud-framework-core里面發(fā)現(xiàn)也引入了mybatis-plus-extension導(dǎo)致與現(xiàn)有項(xiàng)目中的mybatis-plus-extension依賴發(fā)生沖突”
解決方案:
<dependency>
<groupId>com.zjbdos.cloud</groupId>
<artifactId>zjbdos-cloud-framework-core</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
</exclusion>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
</exclusion>
</exclusions>
</dependency>(2) 自定義starter依賴沖突
報(bào)錯(cuò)內(nèi)容:
java.lang.ClassNotFoundException: com.example.MyCustomStarter
原因:
- 自定義starter與項(xiàng)目中其他依賴沖突
- 依賴版本不匹配
4. 依賴沖突排查錯(cuò)誤
(1) 依賴沖突排查錯(cuò)誤
報(bào)錯(cuò)內(nèi)容:
[WARNING] The following dependencies have been relocated: [WARNING] com.example:third-party-library:jar:1.2.3 -> org.hibernate:hibernate-core:jar:5.4.30.Final [WARNING] com.example:third-party-library:jar:1.2.3 -> org.hibernate:hibernate-core:jar:5.2.12.Final
原因:
- 依賴樹分析不充分
- 未正確識(shí)別沖突的依賴
解決方案:
- 使用
mvn dependency:tree命令分析依賴樹 - 通過
-Dincludes參數(shù)過濾特定依賴 - 例如:
mvn dependency:tree -Dincludes=com.yourpackage
三、依賴沖突解決技巧
1. 利用Maven依賴排除機(jī)制(最常用方法)
報(bào)錯(cuò)內(nèi)容:
java.lang.NoClassDefFoundError: org/hibernate/Session
解決方案:
<dependency>
<groupId>com.example</groupId>
<artifactId>third-party-library</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>
最佳實(shí)踐:
- 使用
mvn dependency:tree命令分析依賴樹 - 找出沖突的具體依賴
- 排除依賴時(shí)確保被排除的依賴在其他地方有正確版本引入
2. 依賴版本統(tǒng)一
報(bào)錯(cuò)內(nèi)容:
java.lang.NoSuchMethodError: org.springframework.data.jpa.repository.JpaRepository.save(Ljava/lang/Iterable;)Ljava/util/Collection;
解決方案:
<properties>
<spring-boot.version>2.7.18</spring-boot.version>
<spring-data.version>2022.0.0</spring-data.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>${spring-data.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>3. 本地jar包導(dǎo)入問題
報(bào)錯(cuò)內(nèi)容:
java.lang.NoClassDefFoundError: com.example.ThirdPartyClass
原因:
- 未在打包插件中配置
includeSystemScope - 依賴范圍設(shè)置為
system但未正確打包
解決方案:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
四、依賴問題排查流程
1. 查看詳細(xì)錯(cuò)誤日志
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/app] threw exception [Request processing failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizer]
關(guān)鍵點(diǎn):
- 從日志中獲取具體異常類型
- 查看異常堆棧跟蹤
- 確認(rèn)異常發(fā)生的代碼位置
2. 分析依賴樹
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ myapp --- [INFO] com.example:myapp:jar:1.0.0 [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.7.18:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.7.18:compile [INFO] | | \- org.springframework.boot:spring-boot:jar:2.7.18:compile [INFO] | \- org.springframework.boot:spring-boot-starter-tomcat:jar:2.7.18:compile [INFO] | \- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.73:compile [INFO] +- com.example:third-party-library:jar:1.2.3:compile [INFO] | \- org.hibernate:hibernate-core:jar:5.4.30.Final:compile [INFO] \- org.hibernate:hibernate-core:jar:5.2.12.Final:compile
關(guān)鍵點(diǎn):
- 使用
mvn dependency:tree命令分析依賴樹 - 找出沖突的依賴版本
- 識(shí)別重復(fù)的依賴項(xiàng)
3. 檢查依賴范圍
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ myapp --- [INFO] com.example:myapp:jar:1.0.0 [INFO] +- com.example:third-party-library:jar:1.2.3:system [INFO] | \- org.hibernate:hibernate-core:jar:5.4.30.Final:system [INFO] \- org.hibernate:hibernate-core:jar:5.2.12.Final:compile
關(guān)鍵點(diǎn):
- 檢查依賴范圍(scope)是否正確
- 確認(rèn)system范圍的依賴是否配置了
includeSystemScope
五、依賴問題常見場景及解決方案
| 問題類型 | 報(bào)錯(cuò)內(nèi)容 | 原因 | 解決方案 |
|---|---|---|---|
| 依賴沖突 | NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizer | Spring Boot版本混亂 | 使用mvn dependency:tree分析,排除沖突依賴 |
| 依賴沖突 | NoSuchMethodError: org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory.addErrorPages | 依賴版本不匹配 | 統(tǒng)一依賴版本,使用dependencyManagement |
| 依賴配置錯(cuò)誤 | Could not find artifact com.zjbdos.cloud:zjbdos-cloud-framework-core:pom:1.0.0 | 依賴坐標(biāo)或倉庫錯(cuò)誤 | 檢查依賴坐標(biāo)和倉庫配置 |
| 本地jar導(dǎo)入問題 | NoClassDefFoundError: com.example.ThirdPartyClass | 未配置includeSystemScope | 在spring-boot-maven-plugin中添加includeSystemScope |
| 依賴傳遞沖突 | NoSuchMethodError: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.<init> | 依賴庫版本沖突 | 使用<exclusions>排除沖突依賴 |
| 循環(huán)依賴問題 | BeanCurrentlyInCreationException | 構(gòu)造器注入導(dǎo)致的循環(huán)依賴 | 使用@Lazy或重構(gòu)架構(gòu) |
六、最佳實(shí)踐建議
1. 依賴管理規(guī)范
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.7.18</spring-boot.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>2. 依賴沖突排查流程
- 查看日志:獲取具體異常信息
- 分析依賴樹:使用
mvn dependency:tree命令 - 識(shí)別沖突:找出重復(fù)的依賴和版本
- 解決沖突:使用
<exclusions>排除沖突依賴或統(tǒng)一版本 - 驗(yàn)證:重新打包并測試
3. 依賴沖突預(yù)防措施
- 定期清理依賴:移除不再使用的依賴
- 使用BOM管理:通過Spring Boot的BOM統(tǒng)一依賴版本
- 依賴樹分析:在每次添加新依賴前進(jìn)行依賴樹分析
- 自動(dòng)化檢查:在CI/CD流程中添加依賴沖突檢查
七、歸納下:
SpringBoot項(xiàng)目中的依賴問題主要分為以下幾類:
- 依賴沖突:類找不到、方法找不到、類型轉(zhuǎn)換異常等
- 依賴配置錯(cuò)誤:坐標(biāo)錯(cuò)誤、范圍錯(cuò)誤
- 依賴傳遞沖突:不同庫之間依賴了同一個(gè)庫的不同版本
- 本地依賴導(dǎo)入問題:未正確配置系統(tǒng)范圍依賴
核心排查方法:
- 使用
mvn dependency:tree分析依賴樹 - 識(shí)別沖突的具體依賴
- 使用
<exclusions>排除沖突依賴 - 統(tǒng)一依賴版本
最佳實(shí)踐:
- 使用
dependencyManagement統(tǒng)一管理依賴版本 - 對于本地jar包,確保在打包插件中配置
includeSystemScope - 添加依賴前先進(jìn)行依賴樹分析
- 避免不必要的依賴,保持項(xiàng)目簡潔
到此這篇關(guān)于SpringBoot項(xiàng)目jar依賴問題報(bào)錯(cuò)解析的文章就介紹到這了,更多相關(guān)springboot jar依賴內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot項(xiàng)目瘦身之如何將jar包與lib依賴分開打包
- Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄
- 將springboot項(xiàng)目生成可依賴的jar并引入到項(xiàng)目中的方法
- SpringBoot將所有依賴(包括本地jar包)打包到項(xiàng)目
- springboot項(xiàng)目中引入本地依賴jar包并打包到lib文件夾中
- 使用Springboot 打jar包實(shí)現(xiàn)分離依賴lib和配置
- springboot打包實(shí)現(xiàn)項(xiàng)目JAR包和依賴JAR包分離
- 關(guān)于SpringBoot 打包成的可執(zhí)行jar不能被其他項(xiàng)目依賴的問題
- SpringBoot項(xiàng)目沒有把依賴的jar包一起打包的問題解決
- 詳解springboot解決第三方依賴jar包的問題
相關(guān)文章
Java?8中讀取文件內(nèi)容?Files.lines()方法使用示例
這篇文章主要介紹了Java?8中讀取文件內(nèi)容Files.lines()方法如何使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
spring boot 監(jiān)聽容器啟動(dòng)代碼實(shí)例
這篇文章主要介紹了spring boot 監(jiān)聽容器啟動(dòng)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Spring?Security權(quán)限注解啟動(dòng)及邏輯處理使用示例
這篇文章主要為大家介紹了Spring?Security權(quán)限注解啟動(dòng)及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Springboot中靜態(tài)文件的兩種引入方式總結(jié)
這篇文章主要介紹了Springboot中靜態(tài)文件的兩種引入方式總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
詳解Springboot如何優(yōu)雅的進(jìn)行數(shù)據(jù)校驗(yàn)
基于?Spring?Boot?,如何“優(yōu)雅”的進(jìn)行數(shù)據(jù)校驗(yàn)?zāi)?,本文將待大家詳?xì)介紹Springboot如何優(yōu)雅的進(jìn)行數(shù)據(jù)校驗(yàn),文中有詳細(xì)的代碼示例和流程步驟,需要的朋友可以參考下2023-06-06

