使用JJWT生成JWT报错无法加载DefaultJwtBuilder类问题咨询
JJWT类加载错误问题排查
错误信息
无法从线程上下文类加载器、当前类加载器或系统/应用类加载器中加载名为[io.jsonwebtoken.impl.DefaultJwtBuilder]的类。所有类加载探测逻辑均已执行完毕,仍无法找到该类。请确认是否已将jjwt-impl.jar加入运行时类路径?
当前配置
现有Gradle依赖配置如下:
api 'io.jsonwebtoken:jjwt-api:0.11.2' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2' runtimeOnly('io.jsonwebtoken:jjwt-orgjson:0.11.2') { exclude group: 'org.json', module: 'json' }
问题根因
配置错误出在依赖范围选择上:
runtimeOnly配置的依赖仅在当前模块的运行时阶段生效,不会被编译阶段识别,也不会作为传递依赖暴露给依赖当前模块的其他项目。- 如果当前项目是被其他服务/模块引用的公共组件,下游依赖拉取当前模块jar时,不会引入
jjwt-impl和jjwt-orgjson两个依赖,运行时自然找不到对应的实现类。 - 就算是独立运行的单体应用,部分Gradle插件、旧版本Spring Boot打包插件也存在漏打
runtimeOnly范围依赖的情况,导致运行时类缺失。
修复方案
根据项目类型调整依赖范围即可:
- 独立运行的单体应用(比如单独部署的Spring Boot服务,不需要被其他项目依赖)
将runtimeOnly替换为implementation,配置如下:
api 'io.jsonwebtoken:jjwt-api:0.11.2' implementation 'io.jsonwebtoken:jjwt-impl:0.11.2' implementation('io.jsonwebtoken:jjwt-orgjson:0.11.2') { exclude group: 'org.json', module: 'json' }
- 公共工具库/被其他模块依赖的基础组件
将JJWT相关实现依赖的范围改为api,保证依赖可以正常传递给下游项目:
api 'io.jsonwebtoken:jjwt-api:0.11.2' api 'io.jsonwebtoken:jjwt-impl:0.11.2' api('io.jsonwebtoken:jjwt-orgjson:0.11.2') { exclude group: 'org.json', module: 'json' }
配置修改完成后执行以下命令刷新依赖、清理构建缓存,再重新启动/构建项目即可:
./gradlew clean build --refresh-dependencies
如果调整后仍然报错,检查运行类路径下是否存在其他版本的JJWT依赖,多版本共存导致的类冲突也会触发该报错,排除旧版本冲突依赖即可。
内容的提问来源于stack exchange,提问作者samprasWimb
相关产品推荐
相关产品推荐

