常见依赖错误类型及报错内容
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)错误
- 仓库地址配置错误
- 依赖未发布到指定仓库
解决方案:
- 确认依赖坐标正确
- 检查仓库配置
- 确认依赖已发布到指定仓库
(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里面发现也引入了mybatis-plus-extension导致与现有项目中的mybatis-plus-extension依赖发生冲突”
解决方案:
<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参数过滤特定依赖 - 例如:
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. 依赖版本统一
报错内容:
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]
关键点:
- 从日志中获取具体异常类型
- 查看异常堆栈跟踪
- 确认异常发生的代码位置
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 | 依赖版本不匹配 | 统一依赖版本,使用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>排除冲突依赖 |
| 循环依赖问题 | beancurrentlyincreationexception | 构造器注入导致的循环依赖 | 使用@lazy或重构架构 |
六、最佳实践建议
1. 依赖管理规范
<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>排除冲突依赖或统一版本 - 验证:重新打包并测试
3. 依赖冲突预防措施
- 定期清理依赖:移除不再使用的依赖
- 使用bom管理:通过spring boot的bom统一依赖版本
- 依赖树分析:在每次添加新依赖前进行依赖树分析
- 自动化检查:在ci/cd流程中添加依赖冲突检查
七、归纳下:
springboot项目中的依赖问题主要分为以下几类:
- 依赖冲突:类找不到、方法找不到、类型转换异常等
- 依赖配置错误:坐标错误、范围错误
- 依赖传递冲突:不同库之间依赖了同一个库的不同版本
- 本地依赖导入问题:未正确配置系统范围依赖
核心排查方法:
- 使用
mvn dependency:tree分析依赖树 - 识别冲突的具体依赖
- 使用
<exclusions>排除冲突依赖 - 统一依赖版本
最佳实践:
- 使用
dependencymanagement统一管理依赖版本 - 对于本地jar包,确保在打包插件中配置
includesystemscope - 添加依赖前先进行依赖树分析
- 避免不必要的依赖,保持项目简洁
到此这篇关于springboot项目jar依赖问题报错解析的文章就介绍到这了,更多相关springboot jar依赖内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论