项目启动报错 java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver
问题描述
新建了一个SpringBoot项目,版本号是随机写的,但是项目启动的时候报 java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver。具体报错信息如下:
java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver
at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExcludeAutoConfigurationsProperty(AutoConfigurationImportSelector.java:215) ~[spring-boot-autoconfigure-1.5.12.RELEASE.jar:1.5.12.RELEASE]
at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExclusions(AutoConfigurationImportSelector.java:209) ~[spring-boot-autoconfigure-1.5.12.RELEASE.jar:1.5.12.RELEASE]
at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.selectImports(AutoConfigurationImportSelector.java:99) ~[spring-boot-autoconfigure-1.5.12.RELEASE.jar:1.5.12.RELEASE]
at org.springframework.context.annotation.ConfigurationClassParser$DefaultDeferredImportSelectorGroup.process(ConfigurationClassParser.java:904) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:879) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:809) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:780) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:192) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.27.jar:5.3.27]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.15.jar:2.5.15]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) [spring-boot-2.5.15.jar:2.5.15]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:453) [spring-boot-2.5.15.jar:2.5.15]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:343) [spring-boot-2.5.15.jar:2.5.15]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1370) [spring-boot-2.5.15.jar:2.5.15]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1359) [spring-boot-2.5.15.jar:2.5.15]
at com.zhang.dynamic.datasource.DynamicDataSourceApplication.main(DynamicDataSourceApplication.java:9) [classes/:na]
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_111]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_111]
... 21 common frames omitted
初步分析
POM文件依赖如下
<!-- 这里的版本号是随意加的,并未考虑版本号之间是否兼容 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.5.15</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</dependency>
</dependencies>
首先报错信息是找不到 org/springframework/boot/bind/RelaxedPropertyResolver类,由于好久没有自己新建SpringBoot项目了,有点忘记新建项目的流程,不知道是不是由于缺少某些配置导致的报错。
其次看到报错第二行 spring-boot-autoconfigure-1.5.12.RELEASE.jar:1.5.12.RELEASE,与SpringBoot版本不一致。就开始怀疑是不是版本不兼容导致的报错。
解决方案
使用 mvn dependency:tree 对 POM 文件进行分析。
这里我使用了 mvn dependency:tree > dependencies.txt ,将分析的东西输出到 txt 文件夹中,然后去分析依赖关系,在这里发现 druid-spring-boot-starter 下的 spring-boot-autoconfigure:jar:1.5.12.RELEASE:compile 与 SpringBoot版本的 spring-boot-autoconfigure 是冲突的。
排除druid-spring-boot-starter 下的 spring-boot-autoconfigure的依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.4</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</exclusion>
</exclusions>
</dependency>
最后启动成功!并且 spring-boot-autoconfigure 的版本也是2.5.15。
还有一种解决方案是将 druid-spring-boot-starter 直接换为 druid。具体代码如下
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid-spring-boot-starter</artifactId>-->
<!-- <version>1.2.4</version>-->
<!-- </dependency>-->