从Spring Boot 2.7.2升级到3.0.0-SNAPSHOT遇NoClassDefFoundError问题求助
问题原因
Spring Boot 3.0.0及以上版本基于Jakarta EE 9规范,彻底将原Java EE体系中的javax.*命名空间替换为jakarta.*,你的代码或依赖仍在引用旧的javax.servlet相关类,因此触发NoClassDefFoundError。
解决方法
替换代码中的导入语句
把所有import javax.servlet.*、import javax.servlet.http.*这类导入,统一替换为import jakarta.servlet.*、import jakarta.servlet.http.*。更新依赖适配Jakarta规范
- 若直接引入了servlet-api依赖,替换为Jakarta版本:
<!-- 旧依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- 替换为 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> - 确保Spring Boot父依赖版本为3.0.0及以上,它会自动管理所有Spring生态依赖的Jakarta适配版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.0-SNAPSHOT</version> <relativePath/> </parent>
- 若直接引入了servlet-api依赖,替换为Jakarta版本:
检查第三方依赖兼容性
确认项目中使用的第三方库(如持久层框架、工具类)是否支持Jakarta EE 9。若有依赖仍在使用javax.*命名空间,需升级到对应支持版本(例如Hibernate 6.x、MyBatis 3.5.10+等)。清理重建项目
执行mvn clean install(Maven)或./gradlew clean build(Gradle),清理旧编译文件与依赖缓存,确保新依赖和代码生效。
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

