2025-07-03T16:05:20.850 08:00 ERROR 22144 --- [module_campus] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter] with root causejava.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverterat 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:525) ~[na:na]at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.7.0.jar:0.7.0]at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:106) ~[jjwt-0.7.0.jar:0.7.0]at com.atguigu.campus.utils.JwtHelper.createToken(JwtHelper.java:24) ~[classes/:na]at com.atguigu.campus.com.atguigu.controller.SystemController.login(SystemController.java:89) ~[classes/:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.8.jar:6.2.8]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.8.jar:6.2.8]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.8.jar:6.2.8]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.i
时间: 2025-07-25 19:39:57 浏览: 16
<think>我们正在解决一个Java应用中的NoClassDefFoundError错误,具体是找不到javax.xml.bind.DatatypeConverter类。这个错误发生在使用JDK17和jjwt0.7.0时。根据引用,我们知道这个类在Java9及更高版本中已被移除,所以我们需要通过添加依赖来解决。用户的问题:如何解决在JDK17下使用jjwt0.7.0时出现的NoClassDefFoundError: javax.xml.bind.DatatypeConverter?分析:1.错误原因:从Java9开始,JAXB(JavaArchitecture forXML Binding)被移出了Java SE核心库,需要单独引入依赖。2.jjwt0.7.0版本可能内部依赖了JAXB,但在高版本JDK中缺失,因此抛出异常。解决方案:根据引用[1][2][3],我们可以通过添加JAXBAPI及其相关依赖来解决。但注意,引用[3]提供了更完整的依赖集合(包括jaxb-api,jaxb-impl,jaxb-core, activation),而引用[2]只添加了jaxb-api。考虑到兼容性,建议添加完整的JAXB依赖。具体步骤(Maven项目):1.在pom.xml中添加以下依赖:```xml<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.0</version>
</dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.3.0</version></dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-core</artifactId><version>2.3.0</version></dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>```2.如果你使用的是Gradle,则添加:```groovyimplementation 'javax.xml.bind:jaxb-api:2.3.0'implementation 'com.sun.xml.bind:jaxb-impl:2.3.0'
implementation'com.sun.xml.bind:jaxb-core:2.3.0'implementation 'javax.activation:activation:1.1.1'
```注意:版本号可以根据需要调整,但建议使用2.3.x版本,因为它们在Java9+中工作良好。另外,引用[2]中只添加了jaxb-api,但实际运行时可能还需要其他依赖(如jaxb-impl,jaxb-core等),因此引用[3]的方案更完整。但是,我们也要注意到jjwt0.7.0是一个较老的版本,它可能并不完全兼容JDK17。如果添加了上述依赖后问题仍然存在,建议升级jjwt到更新的版本(如1.x),因为新版本的jjwt可能已经解决了对JAXB的依赖。升级jjwt版本(可选方案):最新版本的jjwt(如0.11.5或更高)已经不再依赖JAXB,并且支持JDK17。因此,如果可能,升级jjwt版本是更好的长期解决方案。升级jjwt的Maven依赖:
```xml<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!--或者jjwt-gson,根据你的JSON库选择--><version>0.11.5</version><scope>runtime</scope>
</dependency>```注意:从jjwt0.10.0开始,项目被拆分成多个模块(api, impl,和json处理器),因此需要添加多个依赖。总结:有两种解决方案:方案一:添加JAXB依赖(适用于不能升级jjwt的情况)方案二:升级jjwt到0.11.x版本(推荐,因为可以避免未来类似问题)请根据项目实际情况选择。相关问题:1.如何检查项目中是否存在其他不兼容JDK17的类?2.升级jjwt到0.11.x版本需要注意哪些API变化?3.除了JAXB,还有哪些Java EE模块在JDK9+中被移除?如何解决?注意:在回答中,我们引用了站内引用[1][2][3]的内容,并在末尾添加了引用标识。</think>### 解决 NoClassDefFoundError: javax.xml.bind.DatatypeConverter 问题
#### 问题分析
在 JDK 17 中使用 jjwt 0.7.0 时出现 `java.lang.NoClassDefFoundError: javax.xml.bind.DatatypeConverter` 错误,是因为 **Java 9+ 移除了 JAXB 模块**(包含 `javax.xml.bind` 包)。jjwt 0.7.0 依赖该模块,但 JDK 17 默认不提供,导致兼容性问题[^1][^2]。
---
### 解决方案(二选一)
#### ✅ 方案一:添加 JAXB 依赖(推荐)
在 `pom.xml` 中添加以下依赖:
```xml
<dependencies>
<!-- JAXB API -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- JAXB 实现 -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
<!-- Java Activation 支持 -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
```
**原理**:
通过显式引入 JAXB API 及其实现(`jaxb-api`, `jaxb-core`, `jaxb-impl`),补全 JDK 缺失的类[^2][^3]。
---
#### ✅ 方案二:升级 jjwt 版本(长期推荐)
jjwt 0.7.0 已过时,**升级到 0.11.5+** 可彻底解决兼容性问题:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- 或 jjwt-gson -->
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
```
**优势**:
- 完全兼容 JDK 11+
- 无需额外 JAXB 依赖
- 修复了旧版本的安全漏洞
---
### 验证步骤
1. 清理并重新构建项目:
```bash
mvn clean install
```
2. 检查依赖树,确认无冲突:
```bash
mvn dependency:tree
```
3. 运行测试用例验证 JWT 功能。
---
### 关键注意事项
1. **JDK 模块化影响**:
若使用模块化项目(`module-info.java`),需添加:
```java
requires java.xml.bind; // 仅方案一需要
```
2. **依赖冲突**:
若同时存在其他 XML 库(如 Xerces),使用 `mvn dependency:tree` 排查版本冲突。
---
### 技术原理
- **JDK 模块移除**:Java 9 将 JAXB 从 `java.se` 模块移至独立模块 `java.xml.bind`,JDK 17 默认不加载[^1]。
- **jjwt 0.7.0 缺陷**:该版本直接调用 `DatatypeConverter`,未处理模块化兼容性。
- **数学表达示例**:
在 JAXB 中,Base64 编码的算法复杂度为 $O(n)$,其中 $n$ 是输入数据长度。
---
阅读全文
相关推荐



















