java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

今天在朋友机子上运行代码,在生成token的时候,遇到了这样一个问题:

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~jjwt-0.9.1.jar:0.9.1 at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:99) ~jjwt-0.9.1.jar:0.9.1 at com.zs.base.util.framework.JwtUtil.createToken(JwtUtil.java:48) ~classes/:na

这个问题是因为 javax.xml.bind.DatatypeConverter 在 Java 9 及更高版本中被移除了。当前使用的 jjwt-0.9.1 版本依赖于这个类进行 Base64 编码和解码,但在 Java 9 及之后的版本中,这个类不再存在。我本机用的是8,朋友电脑用的是17。所以会有这个问题。

有几种解决方法:

1. 添加 javax.xml.bind 依赖

你用的是Java 9 或更高版本,可以手动添加 javax.xml.bind 依赖来解决这个问题。你可以在 pom.xml 中添加以下依赖(适用于 Maven):

XML 复制代码
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

如果是 Gradle 项目,添加如下依赖:

Groovy 复制代码
implementation 'javax.xml.bind:jaxb-api:2.3.1'

2. 升级 JJWT 版本(推荐)

考虑升级 JJWT 到一个较新的版本,JJWT 目前已经支持 Java 9+,并且新的版本不会依赖 javax.xml.bind.DatatypeConverter。你可以在 pom.xml 中将 jjwt 的版本升级到较新的版本(例如 0.11.5 或更高)。

XML 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

3. 使用替代库

如果你不想使用 javax.xml.bind,可以考虑使用其他 Base64 编码解码库,如 Apache Commons Codec,来替换 JJWT 中的 Base64 解码功能。你需要自定义 JwtBuilder 的签名方法。

相关推荐
2601_9638699515 分钟前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
于烛1 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
wuminyu1 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
imaol12 小时前
数据结构---队列
java·数据结构·算法
半亩码田2 小时前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
JAVA面经实录9172 小时前
集合框架 (六)
java·开发语言
骇客野人3 小时前
Linux 查看 Java 进程常用命令
java·linux·运维
周GZ3 小时前
简单讲解Java中静态方法与 实例方法
java·开发语言
疯狂打码的少年3 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
盗理者4 小时前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill