Spring Boot 3.0.0-M4/Spring 6.0.0-M5测试出现NoClassDefFoundError求助
问题分析与解决方案
你的测试失败源于两个核心问题:一是缺少Jakarta Servlet API的模块依赖,二是Spring测试框架所需的AOT相关类无法被模块化路径加载。以下是具体修复步骤:
1. 确保测试依赖完整
在pom.xml中确认引入Spring Boot Starter Test,它包含所有测试必需的依赖(包括Servlet API、事务测试支持等):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2. 修正module-info.java配置
在主模块的module-info.java中补充以下缺失的声明:
module your.module.name { // 原有依赖声明 requires spring.beans; requires spring.context; requires spring.boot.autoconfigure; requires spring.core; requires spring.boot; requires spring.oxm; requires spring.web; requires spring.ws.core; // 添加缺失的模块依赖 requires jakarta.servlet; // 解决ServletContext找不到的错误 requires spring.test; // Spring测试核心模块 requires spring.boot.test; // Spring Boot测试支持 requires spring.boot.test.autoconfigure; // Spring Boot自动配置测试支持 // 开放测试相关包给Spring框架访问 opens your.package.here to spring.core, spring.beans, spring.context, spring.test, spring.boot.test; exports your.package.here to spring.beans, spring.context; }
3. 配置Spring Boot Maven插件支持模块化
确保插件配置中指定模块化布局,避免打包时出现类路径问题:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>MODULE</layout> </configuration> </plugin>
关键说明
- Spring 6/Spring Boot 3完全迁移到Jakarta EE规范,原
javax.servlet相关类已替换为jakarta.servlet,必须通过requires jakarta.servlet声明模块依赖。 BeanFactoryInitializationAotProcessor属于spring.beans模块,但测试过程中需要Spring测试框架能加载到该类,补充spring.test等测试模块依赖后即可解决。- 若测试代码位于独立模块,需为测试模块编写
module-info.test.java,并配置对应的requires和opens声明。
内容的提问来源于stack exchange,提问作者Piotr Sulecki
相关产品推荐
相关产品推荐

