从JDK8迁移到JDK17后如何解决NoSuchFieldError:TOO_MANY_REQUESTS异常
解决JDK17迁移后
java.lang.NoSuchFieldError: TOO_MANY_REQUESTS问题 问题根源
错误核心原因是Oracle OCI SDK的断路器组件尝试访问javax.ws.rs.core.Response.Status.TOO_MANY_REQUESTS字段,但当前类路径存在两种冲突情况:
- 依赖的JAX-RS版本过低:
TOO_MANY_REQUESTS字段是JAX-RS 2.1及以上版本才新增的 - JDK17环境下混合了
javax.ws.rs(旧Java EE)和jakarta.ws.rs(新Jakarta EE)依赖,导致类加载时找不到对应字段
解决方案
1. 统一JAX-RS依赖版本至Jakarta EE兼容版
JDK17推荐使用Jakarta EE 9+的JAX-RS依赖(包路径为jakarta.ws.rs),通过依赖管理锁定版本,避免OCI SDK间接引入旧的Java EE依赖:
<!-- Maven dependencyManagement示例 --> <dependencyManagement> <dependencies> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId>oci-java-sdk-circuitbreaker</artifactId> <version>2.38.0</version> <!-- 选用支持Jakarta的最新OCI SDK版本 --> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>
2. 移除旧Java EE依赖
直接删除项目中所有javax.ws.rs:javax.ws.rs-api相关依赖,替换为jakarta.ws.rs:jakarta.ws.rs-api。
3. 排查依赖冲突
用构建工具检查依赖树,确认没有同时存在javax.ws.rs-api和jakarta.ws.rs-api:
# Maven mvn dependency:tree | grep -E "(javax.ws.rs|jakarta.ws.rs)" # Gradle ./gradlew dependencies | grep -E "(javax.ws.rs|jakarta.ws.rs)"
若发现冲突,在对应依赖中手动排除旧的javax版本。
4. 升级OCI SDK至JDK17兼容版
确保使用的OCI SDK版本≥2.30.0(该版本开始支持Jakarta EE和JDK17),旧版本依赖的Java EE包在JDK17环境下会出现类加载问题。
验证
执行清理构建命令,重启应用:
# Maven mvn clean install # Gradle ./gradlew clean build
内容的提问来源于stack exchange,提问作者Rohit Agrawal
相关产品推荐
相关产品推荐

