升级Java 8到Java 21及Spring Boot 3.2.5后调用apiClient.requestJWTUserToken出现ClassNotFoundException问题求助
最近把项目从Java 8升级到Java 21,同时Spring Boot也升到了3.2.5,结果调用DocuSign的apiClient.requestJWTUserToken时碰到了头疼的报错,相信不少升级Jakarta EE栈的朋友都踩过类似的坑,我来分享下排查和解决的思路:
先把报错信息贴出来方便大家对照:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: jakarta/ws/rs/core/GenericType] with root cause
java.lang.ClassNotFoundException: jakarta.ws.rs.core.GenericType
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[na:na]
问题根源分析
Spring Boot 3.x全面切换到了Jakarta EE规范(包前缀从javax改成jakarta),而Java 8时代用的是Java EE体系。你提到已经加了jakarta/ws/rs/core/GenericType相关依赖但还是报错,大概率是依赖版本不匹配、引入不完整,或者存在旧的javax版本依赖冲突。
具体解决步骤
确保引入正确的Jakarta版本JAX-RS依赖
不要随便找个依赖就加,要选和Spring Boot 3.2.x兼容的Jakarta REST API包,比如Maven中可以这么配置:<dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> <!-- 这个版本和Spring Boot 3.2.x适配性较好 --> </dependency>升级DocuSign SDK到Jakarta适配版本
DocuSign的Java SDK是从特定版本开始支持Jakarta的,如果你的SDK版本还是旧的,内部可能依然依赖javax前缀的类,直接去Maven仓库找最新的支持Jakarta的SDK版本替换掉旧依赖即可。排查并排除依赖冲突
很多第三方库可能还在间接引入旧的javax.ws.rs依赖,导致和Jakarta版本冲突。可以用Maven命令mvn dependency:tree或者Gradle命令gradle dependencies生成依赖树,找到冲突的旧依赖并排除,比如:<dependency> <groupId>xxx</groupId> <artifactId>xxx-third-party-lib</artifactId> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> </exclusions> </dependency>补充JAX-RS实现类(如果需要)
有时候只引入API包还不够,DocuSign SDK可能需要具体的JAX-RS实现才能正常工作,比如RESTEasy或者Jersey。以RESTEasy为例,可以引入适配Spring Boot 3.x的starter:<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-spring-boot-starter</artifactId> <version>6.2.7.Final</version> </dependency>
总结
核心思路就是确保整个项目的依赖完全从javax切换到jakarta,版本统一没有冲突。建议先从升级DocuSign SDK到最新适配版本入手,再逐步排查依赖问题。
备注:内容来源于stack exchange,提问作者Tech Div

