SpringBoot項目jar依賴問題報錯解析
常見依賴錯誤類型及報錯內容
1. 依賴沖突類錯誤
(1) ClassNotFoundException(類找不到)
報錯內容:
java.lang.NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizer
原因:
- 依賴版本不一致,導致類找不到
- 項目中存在不同版本的同一個類
- 依賴沖突,如知識庫[3]中描述的"WebServerFactoryCustomizer這個類是2.x版本才存在"
典型場景:
- Spring Boot版本混亂
- 依賴庫版本不一致
(2) NoSuchMethodError(方法找不到)
報錯內容:
java.lang.NoSuchMethodError: org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory.addErrorPages(Ljava/util/List;)V
原因:
- 依賴版本不匹配,方法簽名不一致
- 不同版本的依賴庫之間存在方法差異
(3) ClassCastException(類型轉換異常)
報錯內容:
java.lang.ClassCastException: com.example.MyClass cannot be cast to com.example.MyClass
原因:
- 加載了不同版本的同一個類
- 類加載器隔離問題
(4) LinkageError(鏈接錯誤)
報錯內容:
java.lang.LinkageError: loader 'app' attempted to load class 'com.example.MyClass' from both 'module1' and 'module2'
原因:
- 類被不同類加載器加載
- 依賴版本不一致導致類加載沖突
2. 依賴配置錯誤
(1) 依賴坐標錯誤
報錯內容:
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/)
原因:
- 依賴坐標(groupId、artifactId、version)錯誤
- 倉庫地址配置錯誤
- 依賴未發(fā)布到指定倉庫
解決方案:
- 確認依賴坐標正確
- 檢查倉庫配置
- 確認依賴已發(fā)布到指定倉庫
(2) 依賴范圍配置錯誤
報錯內容:
java.lang.NoClassDefFoundError: com.example.ThirdPartyClass
原因:
- 依賴范圍(scope)設置為
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) 依賴傳遞沖突
報錯內容:
java.lang.NoSuchMethodError: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.<init>(Lcom/baomidou/mybatisplus/core/parser/ISqlParser;)V
原因:
- 項目中引入了多個版本的MyBatis Plus
- 如知識庫[4]中描述:“zjbdos-cloud-framework-core里面發(fā)現(xiàn)也引入了mybatis-plus-extension導致與現(xiàn)有項目中的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依賴沖突
報錯內容:
java.lang.ClassNotFoundException: com.example.MyCustomStarter
原因:
- 自定義starter與項目中其他依賴沖突
- 依賴版本不匹配
4. 依賴沖突排查錯誤
(1) 依賴沖突排查錯誤
報錯內容:
[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
原因:
- 依賴樹分析不充分
- 未正確識別沖突的依賴
解決方案:
- 使用
mvn dependency:tree命令分析依賴樹 - 通過
-Dincludes參數(shù)過濾特定依賴 - 例如:
mvn dependency:tree -Dincludes=com.yourpackage
三、依賴沖突解決技巧
1. 利用Maven依賴排除機制(最常用方法)
報錯內容:
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>
最佳實踐:
- 使用
mvn dependency:tree命令分析依賴樹 - 找出沖突的具體依賴
- 排除依賴時確保被排除的依賴在其他地方有正確版本引入
2. 依賴版本統(tǒng)一
報錯內容:
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包導入問題
報錯內容:
java.lang.NoClassDefFoundError: com.example.ThirdPartyClass
原因:
- 未在打包插件中配置
includeSystemScope - 依賴范圍設置為
system但未正確打包
解決方案:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
四、依賴問題排查流程
1. 查看詳細錯誤日志
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]
關鍵點:
- 從日志中獲取具體異常類型
- 查看異常堆棧跟蹤
- 確認異常發(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
關鍵點:
- 使用
mvn dependency:tree命令分析依賴樹 - 找出沖突的依賴版本
- 識別重復的依賴項
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
關鍵點:
- 檢查依賴范圍(scope)是否正確
- 確認system范圍的依賴是否配置了
includeSystemScope
五、依賴問題常見場景及解決方案
| 問題類型 | 報錯內容 | 原因 | 解決方案 |
|---|---|---|---|
| 依賴沖突 | NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizer | Spring Boot版本混亂 | 使用mvn dependency:tree分析,排除沖突依賴 |
| 依賴沖突 | NoSuchMethodError: org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory.addErrorPages | 依賴版本不匹配 | 統(tǒng)一依賴版本,使用dependencyManagement |
| 依賴配置錯誤 | Could not find artifact com.zjbdos.cloud:zjbdos-cloud-framework-core:pom:1.0.0 | 依賴坐標或倉庫錯誤 | 檢查依賴坐標和倉庫配置 |
| 本地jar導入問題 | NoClassDefFoundError: com.example.ThirdPartyClass | 未配置includeSystemScope | 在spring-boot-maven-plugin中添加includeSystemScope |
| 依賴傳遞沖突 | NoSuchMethodError: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.<init> | 依賴庫版本沖突 | 使用<exclusions>排除沖突依賴 |
| 循環(huán)依賴問題 | BeanCurrentlyInCreationException | 構造器注入導致的循環(huán)依賴 | 使用@Lazy或重構架構 |
六、最佳實踐建議
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命令 - 識別沖突:找出重復的依賴和版本
- 解決沖突:使用
<exclusions>排除沖突依賴或統(tǒng)一版本 - 驗證:重新打包并測試
3. 依賴沖突預防措施
- 定期清理依賴:移除不再使用的依賴
- 使用BOM管理:通過Spring Boot的BOM統(tǒng)一依賴版本
- 依賴樹分析:在每次添加新依賴前進行依賴樹分析
- 自動化檢查:在CI/CD流程中添加依賴沖突檢查
七、歸納下:
SpringBoot項目中的依賴問題主要分為以下幾類:
- 依賴沖突:類找不到、方法找不到、類型轉換異常等
- 依賴配置錯誤:坐標錯誤、范圍錯誤
- 依賴傳遞沖突:不同庫之間依賴了同一個庫的不同版本
- 本地依賴導入問題:未正確配置系統(tǒng)范圍依賴
核心排查方法:
- 使用
mvn dependency:tree分析依賴樹 - 識別沖突的具體依賴
- 使用
<exclusions>排除沖突依賴 - 統(tǒng)一依賴版本
最佳實踐:
- 使用
dependencyManagement統(tǒng)一管理依賴版本 - 對于本地jar包,確保在打包插件中配置
includeSystemScope - 添加依賴前先進行依賴樹分析
- 避免不必要的依賴,保持項目簡潔
到此這篇關于SpringBoot項目jar依賴問題報錯解析的文章就介紹到這了,更多相關springboot jar依賴內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Springboot項目瘦身之如何將jar包與lib依賴分開打包
- Springboot項目打包如何將依賴的jar包輸出到指定目錄
- 將springboot項目生成可依賴的jar并引入到項目中的方法
- SpringBoot將所有依賴(包括本地jar包)打包到項目
- springboot項目中引入本地依賴jar包并打包到lib文件夾中
- 使用Springboot 打jar包實現(xiàn)分離依賴lib和配置
- springboot打包實現(xiàn)項目JAR包和依賴JAR包分離
- 關于SpringBoot 打包成的可執(zhí)行jar不能被其他項目依賴的問題
- SpringBoot項目沒有把依賴的jar包一起打包的問題解決
- 詳解springboot解決第三方依賴jar包的問題
相關文章
Java?8中讀取文件內容?Files.lines()方法使用示例
這篇文章主要介紹了Java?8中讀取文件內容Files.lines()方法如何使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Spring?Security權限注解啟動及邏輯處理使用示例
這篇文章主要為大家介紹了Spring?Security權限注解啟動及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
詳解Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗
基于?Spring?Boot?,如何“優(yōu)雅”的進行數(shù)據(jù)校驗呢,本文將待大家詳細介紹Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗,文中有詳細的代碼示例和流程步驟,需要的朋友可以參考下2023-06-06

