【问题标题】:How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter Java 11如何解决 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter Java 11
【发布时间】:2023-01-23 04:47:25
【问题描述】:

我有一个 API 可以接收 JWT 令牌以进行授权。

一旦它开始使用令牌进行身份验证的过程,它就会抛出此错误: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

我读到在 Java 11 中他们从 JDK 中删除了 java.xml.bind 库。我按照 answer 中的建议添加了这两个依赖项: implementation "jakarta.xml.bind:jakarta.xml.bind-api:3.0.0"implementation "org.glassfish.jaxb:jaxb-runtime:3.0.0"

还尝试了implementation "jakarta.xml.bind:jakarta.xml.bind-api:3.0.0"implementation 'com.sun.xml.bind:jaxb-impl:3.0.0'

但我仍然遇到同样的错误,我找不到任何其他解决方案。

我使用 Java 11 和 Spring boot 2.6.6。

谢谢您的帮助

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现问题。

标签: java spring-boot jakarta-ee jwt java-11


【解决方案1】:

使用这些依赖项的 2.x 版。在 3.x 版本中,前导前缀 javax 被替换为 jakarta。其他 Java EE / Jakarta EE API 也是如此。

【讨论】:

  • 但是在我使用 3.x 版的第一个选项中,我使用了 jakarta。
  • 是的,Java EE 和 Jakarta EE API 有三种类型:第一种使用以 javax 开头的 groupIds。这些都是 Java EE。然后这些都交给了雅加达项目。这些使用以 jakarta 开头的 groupId。这些 API 的第一个版本仍然使用包前缀 javax,可能是为了更容易过渡。后来的版本将包前缀改为jakarta
  • 是的,但我们已经有了 jakarta V.3.X 依赖项,所以不幸的是我无法降级库版本。所以使用这个 jakarta.xml.bind:jakarta.xml.bind-api:3.0.0 应该没问题吧?
  • 不幸的是,它带有 jakarta 前缀的包。你仍然会得到同样的错误。由于您只能获得一个版本的库,您可能需要改用旧的依赖项:mvnrepository.com/artifact/javax.xml.bind/jaxb-api。如果您需要实现并且仍然需要版本 3 Glassfish 依赖项,请尝试 mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl 的版本 2.x。
  • 我发现我们使用外部库 io.jsonwebtoken:jjwt:0.9.1 Base64Codec 类来解析编码的令牌。在类内部,它从 javax.xml.bind:javax-api:2.3.1 调用 javax.xml.bind.DatatypeConverter。也许这就是为什么更改 jakarta 版本不起作用的原因,因为它无论如何都使用这个版本。因为搜索库,我在 jakarta 3.X 中有 DatatypeConverter 类,但它使用了 javax 中的类。
【解决方案2】:

我通过删除旧的 jjwt 0.9.1 解决了这个问题 并添加这些

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2022-07-25
    • 2017-09-20
    相关资源
    最近更新 更多