jjwt 库从 0.9 升级到 0.11 版本 API 变动怎么适配?

文章导读
JJWT 从 0.9.1 升级到 0.11.2 版本后,约 80% 的现有代码会因 parseClaimsJws 方法签名变更而出现编译错误,必须调整依赖配置和代码调用方式。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

jjwt 库从 0.9 升级到 0.11 版本 API 变动怎么适配?

核心结论:JJWT 从 0.9.1 升级到 0.11.2 版本后,约 80% 的现有代码会因 parseClaimsJws 方法签名变更而出现编译错误,必须调整依赖配置和代码调用方式。

原因分析

JJWT 在 0.10.0 版本进行了架构巨变,从单一 JAR 包拆分为三个核心模块:jjwt-api(定义接口与抽象类)、jjwt-impl(提供默认实现)、jjwt-jackson(支持 JSON 序列化)。0.9.1 及之前版本只需引入一个依赖io.jsonwebtoken:jjwt:0.9.1,而 0.11.2 版本必须同时引入三个模块且版本号严格保持一致。最典型的报错信息为:错误:找不到符号 符号:方法 parseClaimsJws(java.lang.String) 位置:接口 io.jsonwebtoken.JwtParserBuilder。这是因为 0.11.x 版本中parseClaimsJws(String)方法被重构,需要先调用setSigningKey()配置密钥后再解析。

解决方案

2.1 修改 Maven 依赖配置

删除原有的 0.9.1 依赖,替换为以下三个模块(版本号必须均为 0.11.2):

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.11.2</version>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-impl</artifactId>
  <version>0.11.2</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-jackson</artifactId>
  <version>0.11.2</version>
  <scope>runtime</scope>
</dependency>

执行mvn dependency:tree | grep jsonwebtoken命令检查依赖树,确保没有旧版本 0.9.1 残留。

2.2 代码迁移示例

0.9.1 版本的典型代码:

Claims claims = Jwts.parser()
  .setSigningKey(secret)
  .parseClaimsJws(token)
  .getBody();

0.11.2 版本的正确写法:

jjwt 库从 0.9 升级到 0.11 版本 API 变动怎么适配?
Claims claims = Jwts.parserBuilder()
  .setSigningKey(key)
  .build()
  .parseClaimsJws(token)
  .getBody();

注意密钥类型变更:0.9.x 允许直接使用 String 类型密钥,0.11.x 推荐使用java.security.Key对象,可通过io.jsonwebtoken.security.Keys工具类生成。

2.3 清理本地 Maven 仓库

删除本地仓库中的旧版本缓存:rm -rf ~/.m2/repository/io/jsonwebtoken/jjwt/0.9*,然后执行mvn clean compile重新构建项目。

注意事项

1. 依赖冲突问题:Spring Boot 2.3.x 早期版本可能通过 spring-security-oauth2 传递性引入 JJWT 0.9.1,需使用<exclusions>排除旧依赖。

2. 密钥强度要求:0.11.x 版本对 HS256 算法要求密钥至少 256 位,使用短字符串密钥会抛出WeakKeyException异常。

3. 序列化兼容性:若项目使用 Gson 而非 Jackson,需将jjwt-jackson替换为jjwt-gson模块,否则可能出现DecodingException: Illegal base64 character错误。

jjwt 库从 0.9 升级到 0.11 版本 API 变动怎么适配?

4. 运行时异常风险:即使编译通过,若 jjwt-api 与 jjwt-impl 版本不一致(如 api 用 0.11.5 而 impl 用 0.10.8),运行时会抛出NoSuchMethodErrorAbstractMethodError

参考来源

来源:CSDN 博客 - 别再被 JJWT 新版坑了!手把手教你从 0.12.x 降级到 0.11.2 解决 parseClaimsJws 报错

来源:知乎技术专栏 - JJWT 版本升级陷阱:从 parseClaimsJws 报错看 JJWT API 的演进与兼容性

来源:Maven Central - io.jsonwebtoken:jjwt-api:0.11.2 依赖文档

来源:GitHub Issue - JJWT 0.10.0 模块化拆分说明