昨天遇到了一个很奇怪的错误,在我使用Spring Boot创建一个新项目时,一直报错,显示“java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver”。好在,我找到了解决方法,现在就和大家分享一下。
一、问题描述
在使用Spring Boot创建项目时,在程序启动时,我遇到了以下的报错信息:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-09-09 17:28:57.357 ERROR 8026 --- [ main] o.s.boot.SpringApplication : Application run failed
java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver
at org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration$$EnhancerBySpringCGLIB$$9b8765b6.<init>(<generated>)
at org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration$$FastClassBySpringCGLIB$$7d5fb908.newInstance(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
......
二、分析过程
这个报错信息非常奇怪,因为这个错误信息实在启动阶段就出现的。我尝试了很多方法,例如在pom.xml文件中添加依赖,但是均无效。在这里将我的解决方法分享给大家。
首先确定了错误信息:java.lang.NoClassDefFoundError,这意味着我的类路径出现了问题。
然后查看了异常信息中间的内容:“org/springframework/boot/bind/RelaxedPropertyResolver”,发现这个问题和Spring框架配置文件有关,考虑到Spring Boot 的自动配置的原理,这里有一个可能是自动配置过程中某一个 jar 包的版本不兼容的问题。在保证项目其他环境没问题的情况下,我猜想可能是Spring Boot的版本太新,或者是其他jar包的版本与Spring Boot不兼容。
三、解决方法
解决这个问题的方法就比较简单了,只需要把Spring Boot的版本号稍微降低一点即可,也可以在pom.xml文件中删除掉Spring Boot和其他 jar 包的版本号(忽略版本)。
修改后的pom.xml文件如下:
<dependencies>
<!-- Spring Boot starters -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data MongoDB -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MongoDb Driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.6.0</version>
</dependency>
</dependencies>
我将Spring Boot的版本改成了2.1.3.RELEASE
,效果良好,程序在运行时不再报错。
在Gradle中,解决方法如下:
configurations.all {
resolutionStrategy {
force 'commons-io:commons-io:2.0.1'
}
}
四、小结
通过上述分析和解决后,我们可以总结出一些解决方法:
- 确认错误信息,有可能是类路径出现问题;
- 查看异常信息中间的内容,判断是否是Spring框架的配置文件的问题;
- 降低Spring Boot版本号,或者让Gradle强制选择一些jar包的版本;
- 持续学习和使用新的技术,避免出错。
短时间内,我想不出还有什么需要补充的了,因为我已经详细阐述了问题产生的原因、解决方法和实现步骤。希望这篇技术分享对程序员们在实际的工作中有所帮助。
不管我们是在什么地方遇到了问题,我们都不要放弃并逐一分析问题,找到解决问题的方法,积极探究原因并投入到解决方案中去。
希望本篇文章能给正在遇到该问题的读者们提供指导和帮助,如果文章能得到大家的认可和支持,欢迎分享给更多的人。谢谢大家!