Spring Boot 2.7升级Jakarta Annotations API 2.1.1后遇NoClassDefFoundError如何解决?
问题解决办法
原因分析
Spring Boot 2.7版本仍基于javax命名空间构建,而你升级的jakarta.annotations-api:2.1.1已经完全迁移到jakarta命名空间,原javax.security.RunAs类已被重命名为jakarta.security.RunAs,导致应用启动时找不到旧的javax类,抛出NoClassDefFoundError。
具体解决方案
回退注解API版本:将
jakarta.annotations-api降级到1.x系列(该版本兼容javax命名空间,与Spring Boot 2.7适配)。- Maven项目修改
pom.xml:<dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>1.3.5</version> </dependency> - Gradle项目修改
build.gradle:implementation 'jakarta.annotation:jakarta.annotation-api:1.3.5'
- Maven项目修改
排查依赖冲突:如果项目中其他依赖强制引入了
jakarta.annotations-api2.x版本,需要用依赖分析工具定位并排除:- Maven执行命令:
mvn dependency:tree,找到冲突的依赖节点,通过<exclusions>排除高版本:<dependency> <!-- 存在冲突的依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> </exclusion> </exclusions> </dependency> - Gradle执行命令:
./gradlew dependencies,找到冲突依赖后添加exclude:implementation('xxx:xxx') { exclude group: 'jakarta.annotation', module: 'jakarta.annotation-api' }
- Maven执行命令:
长期方案(可选):如果业务允许,考虑升级到Spring Boot 3.x版本,该版本全面支持Jakarta EE 9+规范,可直接使用
jakarta.annotations-api2.x及以上版本,但升级需要将项目中所有javax相关类替换为jakarta命名空间,改动范围较大。
内容的提问来源于stack exchange,提问作者venky jillella
相关产品推荐
相关产品推荐

