问题根源
在 Java 9 及更高版本中,Java 平台经历了模块化系统(Jigsaw 项目)的重大变化。作为这一变化的一部分,某些 API 被移出了默认的 JDK 发行版,其中包括 JAXB (Java Architecture for XML Binding) API。因此,在使用这些被移除的 API 时,如果应用程序或库没有适当地包含它们,就会抛出 ClassNotFoundException
或 NoClassDefFoundError
异常。
javax.xml.bind.DatatypeConverter
是一个属于 JAXB API 的类,它通常用于 XML 数据绑定,但在较新的 Java 版本中不再默认可用。你的堆栈跟踪显示,这个类正被 io.jsonwebtoken
库用来进行 Base64 编解码操作。由于你使用的 JJWT 版本依赖于这个类,所以当你运行程序时,就遇到了 ClassNotFoundException
。
解决方案
1. 添加 JAXB 依赖
对于 Maven 项目:
如果你使用的是 Maven 构建工具,可以通过修改 pom.xml
文件来添加必要的依赖项。你需要确保项目能够访问 JAXB API 和它的实现。这里提供了两个依赖项,分别是 API 和运行时:
<dependencies>
<!-- JAXB API -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- JAXB Runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
对于 Gradle 项目:
如果你使用的是 Gradle 构建工具,可以在 build.gradle
文件中添加如下依赖:
dependencies {
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
}
注意事项:
- 确保选择与你的应用程序兼容的版本。
- 如果你在 Spring Boot 项目中工作,Spring Boot 可能有自己的依赖管理策略,所以请检查是否有覆盖或冲突的情况。
2. 更新 JJWT 库
旧版本的 JJWT 可能直接依赖于 javax.xml.bind.DatatypeConverter
来处理 Base64 编解码。新版本的 JJWT 已经解决了这个问题,它们不再依赖于已废弃的类,并且有独立的方法来进行 Base64 编解码。
你可以通过访问 JJWT GitHub 页面 获取最新版本的信息。按照官方文档更新到最新的稳定版本,并根据需要调整代码以适应任何API变更。
具体步骤:
- 检查当前项目的 JJWT 版本。
- 访问 JJWT GitHub 仓库,找到最新发布的版本号。
- 修改项目的构建文件(Maven 的
pom.xml
或 Gradle 的build.gradle
),将 JJWT 依赖更新为最新版本。 - 如果升级后有任何不兼容的变化,请参考迁移指南进行必要的代码调整。
- 测试应用,确保一切正常工作。
3. 使用替代方法
如果你暂时无法升级 JJWT 或者不想引入额外的依赖,可以考虑修改代码,用其他方式实现 Base64 编解码。例如,可以直接使用 Java 8 引入的标准库中的 java.util.Base64
类来进行编解码。
具体步骤:
- 找到所有调用
DatatypeConverter.printBase64Binary
和DatatypeConverter.parseBase64Binary
的地方。 - 替换为
java.util.Base64
提供的等效方法:
import java.util.Base64;
// 替代 DatatypeConverter.printBase64Binary
String encoded = Base64.getEncoder().encodeToString(bytes);
// 替代 DatatypeConverter.parseBase64Binary
byte[] decoded = Base64.getDecoder().decode(encodedString);
- 对修改后的代码进行全面测试,确保功能正确无误。
- 如果你正在使用第三方库并且不能修改其源代码,则需要寻找该库的更新版本或者联系开发者请求支持。
总结
为了彻底解决问题,建议优先尝试更新 JJWT 库至最新版本,因为这是最直接也是最持久的解决方案。如果出于某种原因无法这样做,那么添加 JAXB 依赖或者替换 Base64 编解码逻辑都是有效的备选方案。无论采取哪种方法,都应确保对改动后的代码进行了充分的测试,以保证系统的稳定性。
标签:lang,xml,bind,Base64,JJWT,API,版本,DatatypeConverter From: https://blog.csdn.net/m0_50742275/article/details/144590509