解决NoClassDefFoundError:org/springframework/aot/AotDetector错误的一个方案
目录
错误分析
解决方案
今天在启动SpringBoot工程时出现了这样一个错误,这个错误导致我SpringBoot应用启动失败:
详细信息如下:
java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector
at org.mybatis.spring.mapper.ClassPathMapperScanner.<init>(ClassPathMapperScanner.java:95)
at org.mybatis.spring.mapper.MapperScannerConfigurer.postProcessBeanDefinitionRegistry(MapperScannerConfigurer.java:387)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:142)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:756)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:572)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
at com.easygpt.RunEasyGptApplication.main(RunEasyGptApplication.java:9)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: org.springframework.aot.AotDetector
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 18 common frames omitted
这是一个java.lang.NoClassDefFoundError错误
,它表示在运行时找不到类org.springframework.aot.AotDetector
错误分析
-
NoClassDefFoundError
:当Java虚拟机在加载类时找不到该类的定义时,会抛出此错误。这通常是由于类路径中缺少必要的库或版本不匹配引起的。 -
org.springframework.aot.AotDetector:
这是Spring Framework中的一个类,属于Spring AOT(Ahead-of-Time)处理的一部分。从Spring Framework 6.x版本开始,引入了AOT支持,包括AotDetector
类。 -
堆栈跟踪显示:错误发生在
ClassPathMapperScanner
的初始化过程中,而该类属于 MyBatis-Spring 集成部分。这意味着 MyBatis-Spring 正在尝试使用Spring Framework中的某个不存在的类。
-
可能的原因:
-
依赖版本不兼容:
- MyBatis-Spring版本与Spring Framework版本不匹配。
- 使用了需要Spring Framework 6.x的MyBatis-Spring 3.x,但项目依赖于Spring Framework 5.x。
-
缺少依赖库:
- 项目中缺少
spring-aot
相关依赖。
- 项目中缺少
-
解决方案
-
步骤一:检查依赖版本
-
查看Spring Boot和Spring Framework的版本:
- 在
pom.xml
中找到spring-boot-starter-parent
的版本。 - 说明Spring Boot 2.x对应Spring Framework 5.x,Spring Boot 3.x对应Spring Framework 6.x。
- 在
-
查看MyBatis-Spring的版本:
- 在
pom.xml
中找到mybatis-spring-boot-starter
的版本。 - 指出MyBatis-Spring 3.x需要Spring Framework 6.x支持。
- 在
-
-
步骤二:统一依赖版本
-
方案一:降级mybatis-spring-boot-starter版本
- 将
mybatis-spring-boot-starter
版本降级到2.3.x,以适配Spring Framework 5.x。 -
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency>
降低mybatis-spring-boot-starter版本到2.x并重新启动,这个方案可行,最终成功解决了问题。
- 将
-
-
方案二:升级Spring Boot和Spring Framework版本
- 将Spring Boot升级到3.x版本,同时使用Java 17或更高版本。
- 示例修改:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.4</version> </parent> <properties> <java.version>17</java.version> </properties>
- 注意事项:
- 升级后需要检查其他依赖的兼容性。
- 可能需要修改代码以适应新的版本特性。
-
- 执行命令:
mvn clean install
- 目的:
- 清除旧的构建产物,确保新的依赖生效。
- 执行命令: