如何在Java 9中解决java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException

And*_*ert 718 java jaxb java-9 java-10 java-11

我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的.当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类.

自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?

And*_*ert 1050

JAXB API被认为是Java EE API,因此不再包含在Java SE 9中的默认类路径中.在Java 11中,它们完全从JDK中删除.

Java 9引入了模块的概念,默认情况下,java.se聚合模块在类路径(或更确切地说,模块路径)上可用.正如其名称所暗示的,java.se汇聚模块并没有包括那些与Java 6/7/8传统上捆绑了Java EE的API.

幸运的是,JDK 6/7/8中提供的这些Java EE API仍然在JDK中,但它们默认情况下不在类路径上.以下模块中提供了额外的Java EE API:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Run Code Online (Sandbox Code Playgroud)

快速而肮脏的解决方案:(仅限JDK 9/10)
要在运行时使JAXB API可用,请指定以下命令行选项:
--add-modules java.xml.bind

但我仍然需要这个与Java 8一起工作!
如果您尝试--add-modules使用较旧的JDK进行指定,那么它将会爆炸,因为它是一个无法识别的选项.我建议两种选择之一:

  1. 您可以通过检查检查JDK版本有条件地适用参数的启动脚本(如果有的话)JDK_JAVA_OPTIONSjava属性.
  2. 您可以添加-XX:+IgnoreUnrecognizedVMOptions以使JVM静默忽略无法识别的选项,而不是炸毁.但要小心!您使用的任何其他命令行参数将不再由JVM验证.此选项适用于Oracle/OpenJDK以及IBM JDK(从JDK 8sr4开始)

备用快速解决方案:(仅限JDK 9/10)
请注意,您可以通过指定--add-modules java.se.ee选项在运行时使所有上述Java EE模块可用.该java.se.ee模块是一个聚合模块,包括java.se.ee以上Java EE API模块.


适当的长期解决方案:(所有JDK版本)

上面列出的Java EE API模块都已标记java.se.ee,因为它们计划Java 11中删除.因此,该@Deprecated(forRemoval=true)方法将不再适用于Java 11开箱即用.

您需要在Java 11和转发中执行的操作是在类路径或模块路径上包含您自己的Java EE API副本.例如,您可以将JAX-B API添加为maven依赖项,如下所示:

<!-- API, java.xml.bind module -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime, com.sun.xml.bind module -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

有关Java模块化的完整详细信息,请参阅JEP 261:模块系统

  • 我已经添加了这些依赖项,但它仍然给我同样的错误。有什么想法为什么吗? (28认同)
  • 因此,如果Java EE API模块被标记为已弃用,那么这意味着Java 10 JAXB在运行时在Java 10中将不再可用吗?这似乎是倒退一步.我们将不得不回到包含JAXB作为依赖关系的前6练习. (6认同)
  • 现在,Java 11已发布,并且java.se.ee模块已被删除,因此--add-modules解决方案不再起作用。请使用推荐的解决方案:将JAXB添加为单独的依赖项。 (5认同)
  • 根据迁移指南,建议不要使用--add-modules java.se.ee或--add-modules ALL-SYSTEM作为变通方法https://docs.oracle.com/javase/9​​/migrate/与Java EE共享默认情况下未解析 - >第1点 (4认同)
  • 随着Java 10的正式发布,我们可以确认add-modules方法仍然有效.根据[JEP-320](http://openjdk.java.net/jeps/320)计划在Java 11中删除`javax.xml.bind`和其他JavaEE类. (4认同)
  • 我的理解是,目的是在完全决定何时/何时删除它之前评估多少取决于模块(参见[here](http://mail.openjdk.java.net/pipermail/jdk9-dev/2016 -May/004309.html)),但是现在它绝对是为了最终在未来某个时候被删除(并且项目应该使用外部依赖项来实现功能).随着Java的新发布时间表,我不清楚是否会出现"Java 10"或者没有,或者确切地说是否可以删除它. (2认同)
  • jaxb-core和jaxb-impl不再存在版本`2.2.8`.使用`2.2.11`或`2.3.0`工作正常. (2认同)
  • 如果您使用“2.3.0”,则包名称与以前相同:“javax.xml.bind...”。如果您使用更高版本,例如 3.x 和 4.x,那么您需要修改代码以使用“jakarta.xml.bind...”等包 (2认同)

jde*_*dev 224

在我的情况下(spring boot fat jar)我只是将以下内容添加到pom.xml中.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9 (9认同)
  • 像`testCompile('javax.xml.bind:jaxb-api')这样添加gradle依赖项对我有用. (9认同)
  • @Tuno的链接对我不起作用,固定的链接是:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9-and-above (5认同)
  • 就像提到的@pamcevoy一样,在使用Spring Boot时不需要指定jaxb-api的版本.Boot自动管理版本. (4认同)
  • 我建议在这种情况下使用&lt;scope&gt; runtime &lt;/ scope&gt; (2认同)

And*_*niy 62

在最近的JDK 9.0.1中,这些解决方案都不适用于我.

我发现这个依赖项列表足以实现正常运行,因此您不需要显式指定--add-module(尽管它是在这些依赖项的pom中指定的).您唯一需要的是指定此依赖项列表:

<dependencies>
    <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>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

  • 发生了非法反射访问操作警告:com.sun.xml.bind.v2.runtime.reflect.opt.Injector非法反射访问(文件:/ C:/Users/eis/.m2/repository/com/sun/ xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar)方法java.lang.ClassLoader.defineClass(java.lang.String,byte [],int,int)警告:请考虑将此情况报告给com.sun.xml.bind.v2.runtime.reflect.opt.Injector的维护者警告:使用--illegal-access = warn启用进一步非法反射访问操作的警告警告:所有非法访问操作都将是在将来的版本中被拒绝 (8认同)
  • @Anil这是Maven配置的`pom.xml`文件.如果你不知道那是什么,那么最好从开始开始 (3认同)
  • 对于JDK 8,从上面删除jaxb-core和jaxb-impl. (2认同)
  • 惊人的。我遇到过这样一种情况——出于某种原因——spring boot 应用程序会在 intellij CE 中运行,但在 mac 上不会运行,在 eclipse 中运行,但不会在 win10 上运行 intellij CE。能够在两个平台上的一个 IDE 中工作是一个优势。 (2认同)

Mik*_*kov 40

这对我有用:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.7.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

更新

正如@Jasper建议的那样,为了避免依赖整个EclipseLink库,你也可以依赖于EclipseLink MOXy:

Maven的

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>2.7.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

摇篮

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
Run Code Online (Sandbox Code Playgroud)

作为我的Java 8应用程序的依赖项,它生成一个*.jar,它可以由JRE 8或JRE 9运行,没有其他参数.

此外,这需要在使用JAXB API之前在某处执行:

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
Run Code Online (Sandbox Code Playgroud)

到目前为止工作得很好,作为一种解决方法.虽然看起来不是一个完美的解决方案......

  • 添加`org.eclipse.persistence:eclipselink`只是为了获取JAXB API是一个非常重的依赖,除非你已经在使用eclipselink? (5认同)
  • 是的,它很重(约9mb),是的,我一直在使用它.我已经提到过,这只是一个替代方法,对于那些可能是临时的,必须在同一个jar/war中使用8和9个JRE而不提供命令行参数的人. (4认同)
  • 为了JDK 8和9之间的互操作,我建议使用`-XX:+ IgnoreUnrecognizedVMOptions`命令行选项(更新我的回答详细信息) (2认同)

Ces*_*z T 34

这是因为java版本,如果你使用jdk 9或更高版本,只需将它添加到你的pom

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 我在 Spring Boot 指南中一直遇到这个问题......非常感谢。 (2认同)
  • @Cesar Rodriguez T,我用一个大摇大摆的例子尝试了这个,编译工作但运行出错。我使用了包含更多依赖项并且有效的选定答案。 (2认同)

Pal*_*nal 18

在编译和运行时,添加开关 --add-modules java.xml.bind

javac --add-modules java.xml.bind <java file name>

java --add-modules java.xml.bind <class file>
Run Code Online (Sandbox Code Playgroud)

有关这些JDK 9模块的详细介绍,请访问:https: //www.youtube.com/watch?v = KZfbRuvv5qc


Seb*_*ees 18

所有JDK的清洁解决方案> = 9

您需要为构建添加两个依赖项

  • jaxb-api
  • 一个jaxb实现

作为一个实现,我选择使用glassfish的参考实现来摆脱旧的com.sun类/库.因此,我添加了我的maven构建

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

请注意,从版本2.3.1开始,您不再需要添加javax.activation.(见https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)

  • 适用于 JDK 11。 (5认同)
  • 与 java 12 中的多模块项目完美配合。 (2认同)

Fáb*_*nto 17

为了解决这个问题,我在项目中导入了一些JAR文件:

  • javax.activation中-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • JAXB的API-2.3.0.jar

http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • JAXB的核心2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar

  • JAXB的IMPL-2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar

  1. 下载上述文件并将其复制到项目中的libs文件夹中
  2. 在Java Build Path中添加导入的JAR文件

  • 请注意,`com.sun.xml.bind`工件很旧,仅提供向后兼容性。您应该使用等效的org.glassfish.jaxb工件,如其他一些答案中所述。 (2认同)

ric*_*o_s 12

I also stumpled accross the ClassNotFoundException:javax.xml.bind.DatatypeConverter using Java 11 and

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

I tried all this stuff around adding javax.xml.bind:jaxb-api or spring boot jakarta.xml.bind-api .. I found a hint for fixes in jjwt version 0.10.0 .. but most importantly, the jjwt package is now split !

Thus, check this reference: https://github.com/jwtk/jjwt/issues/510

Simply, if you use

Java11 and jjwt 0.9.x and you face the ClassNotFoundException:javax.xml.bind.DatatypeConverter issue,

go for

jjwt version 0.11.x, but use the splitted packages: https://github.com/jwtk/jjwt#install

You maven wont find a higher version for jjwt dependency, since they split the packages.

Cheers.


小智 11

您可以使用--add-modules=java.xml.bindJVM选项将xml绑定模块添加到JVM运行时环境.

例如: java --add-modules=java.xml.bind XmlTestClass


Jas*_*ext 11

以下哪些工件应该用于我的Maven项目中的JAXB RI? 在Maven中,您可以使用如下配置文件:

    4.1. Changes between 2.3.0.1 and 2.4.0

         JAXB RI is now JPMS modularized:

            All modules have native module descriptor.

            Removed jaxb-core module, which caused split package issue on JPMS.

            RI binary bundle now has single jar per dependency instead of shaded fat jars.

            Removed runtime class weaving optimization.

    4.2. Changes between 2.3.0 and 2.3.0.1

          Removed legacy technology dependencies:

            com.sun.xml.bind:jaxb1-impl

            net.java.dev.msv:msv-core

            net.java.dev.msv:xsdlib

            com.sun.xml.bind.jaxb:isorelax

    4.3. Changes between 2.2.11 and 2.3.0

          Adopt Java SE 9:

            JAXB api can now be loaded as a module.

            JAXB RI is able to run on Java SE 9 from the classpath.

            Addes support for java.util.ServiceLoader mechanism.

            Security fixes
Run Code Online (Sandbox Code Playgroud)

依赖树显示:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
Run Code Online (Sandbox Code Playgroud)

要在Eclipse中使用它,请说Oxygen.3a Release(4.7.3a)或更高版本,Ctrl-Alt-P,或右键单击项目Maven,然后选择配置文件.


Mr *_*edi 10

这对我有用.仅添加jaxb-api是不够的.

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`com.sun.xml.bind` 工件是旧的,仅用于向后兼容。您应该改用等效的 `org.glassfish.jaxb` 工件,如其他一些答案中所述。 (2认同)

Hie*_*ker 10

使用 JDK 9+ 时需要添加 JAX-B 依赖项。对于 Android Studio 用户,您需要将其添加到您的build.gradle'sdependencies {}块中:

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
    compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"

    testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的解决方案! (3认同)

Kum*_*hek 9

转到Build.gradle并为Java 9或Java 10添加以下依赖项.

sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 

//java 9+ does not have Jax B Dependents

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
    compile group: 'javax.activation', name: 'activation', version: '1.1.1'
Run Code Online (Sandbox Code Playgroud)


小智 9

添加以下依赖项对我有用。

        <!-- API, java.xml.bind module -->
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>2.3.2</version>
    </dependency>

    <!-- Runtime, com.sun.xml.bind module -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.2</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,自 jdk 11 起,javax 库已被弃用。只需将 javax 依赖项替换为 Jakarta 库依赖项(参考下面的链接)即可。https://wiki.eclipse.org/Jakarta_EE_Maven_Cooperatives (2认同)

mvw*_*mvw 8

对于Java Web Start Execution,我们可以使用Andy Guibert的建议:

<j2se version="1.6+" 
      java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
Run Code Online (Sandbox Code Playgroud)

注意--add-modules中的额外"=".请参阅此OpenJDK TicketJava平台标准版Oracle JDK 9迁移指南的 "了解运行时访问警告"中的最后一个注释.


小智 8

在pom.xml中添加javax.xml.bind依赖项

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)


dsc*_*ten 8

由于 JavaEE 现在由https://jakarta.ee/ 管理,自 2.3.2 起,新的 Maven 坐标为:

https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts

第一个发布的 jaxb.version 是 2.3.2。

<properties>
  <jaxb.version>2.3.2</jaxb.version>
</properties>

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>${jaxb.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Pro*_*ton 7

我在Debian 10 中处理Java 项目时遇到了这个问题。

每次我启动应用程序时,它都会在日志文件中抛出错误:

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

这是我解决它的方法

当类路径中缺少JAXB库(用于 XML 绑定的 Java 架构)时,通常会导致该问题。JAXB 包含在 Java SE 10 或更早版本中,但从 Java 11 或更高版本中从 Java SE 中删除 - 移至 Jakarta EE 项目下的 Java EE。

因此,我使用以下方法检查了我的 Java 版本:

java --version
Run Code Online (Sandbox Code Playgroud)

它给了我这个输出

openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Debian-1deb10u1, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

所以我遇到了JAXBException错误,因为我使用的是Java 11,它没有 JAXB 库(用于 XML 绑定的 Java 架构)在类路径中丢失。JAXB 包含在其中。

为了解决这个问题,我必须将JAXB API库添加到我的 tomcat 安装的lib ( /opt/tomcat/lib) 目录中:

sudo wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar
Run Code Online (Sandbox Code Playgroud)

然后我将其重命名jaxb-api-2.4.0-b180830.0359.jarjaxb-api.jar

sudo mv jaxb-api-2.4.0-b180830.0359.jar jaxb-api.jar
Run Code Online (Sandbox Code Playgroud)

注意:确保您更改了允许 tomcat 访问文件的权限,并将所有权更改为tomcat

sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R 777 /opt/tomcat/
Run Code Online (Sandbox Code Playgroud)

然后我重新启动了 tomcat 服务器:

sudo systemctl restart tomcat
Run Code Online (Sandbox Code Playgroud)

资源[已解决] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

就这样。

我希望这有帮助


Dav*_*fer 6

不是答案,而是附录:我得到的结果是groovysh,如果 JAVA_HOME 指向 Java 9 安装(java version "9.0.1"准确地说),则运行(Groovy 2.4.13)会失败:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more
Run Code Online (Sandbox Code Playgroud)

解决方案是:

  • 转至github.io 上的JAXB 项目“JAXB 已获得双重许可 - CDDL 1.1 和 GPL 2.0,且具有类路径例外”

  • 下载jaxb-ri-2.3.0.zip

  • 无论您将 Java 基础结构文件放在何处,都请解压(在我的例子中为/usr/local/java/jaxb-ri/)。可能存在其他解决方案(也许通过 SDKMAN,我不知道)

  • 确保 lib 子目录中的 jar 位于CLASSPATH. 我通过在 bash 启动时启动的名为 的脚本来完成此操作/etc/profile.d/java.sh,我在其中添加了(以及许多其他行)以下循环:

打包成一个函数...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg
Run Code Online (Sandbox Code Playgroud)

它有效!

  • Java 开发人员通常使用 Gradle 或 Maven 等构建工具来管理依赖项,而不是手动下载 jar。这可能就是投反对票的原因。 (8认同)

its*_*ghz 6

我遵循此URL,以下设置确实对我有所帮助。我在Macbook Pro中将Java 10与STS IDE一起使用。它像一种魅力。

   <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Jav*_*ide 6

2.0.5.RELEASE在Java 11上使用Spring Boot遇到了相同的问题。

javax.xml.bind:jaxb-api:2.3.0单独添加并不能解决问题。我还必须将Spring Boot更新到最新的Milestone 2.1.0.M2,因此我认为这将在下一个正式版本中得到解决。


小智 6

你可以使用这个依赖项

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


kac*_*nov 5

这解决了我在Java 12上运行Apache Camel 2.24.1的依赖项的问题:

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <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.0.1</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)


Wil*_*zel 5

正如官方文档所述:

升级时可能会遇到以下情况:

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

Hibernate 通常需要默认不再提供的 JAXB。您可以添加 java.xml.bind 模块以使用 Java9 或 Java10 恢复此功能(即使该模块已弃用)。

从 Java11 开始,该模块不可用,因此您唯一的选择是添加 JAXB RI(从 Java9 开始,您可以这样做来代替添加 java.xml.bind 模块:


马文

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

摇篮(build.gradle.kts):

implementation("org.glassfish.jaxb:jaxb-runtime")
Run Code Online (Sandbox Code Playgroud)

摇篮(build.gradle)

implementation 'org.glassfish.jaxb:jaxb-runtime'
Run Code Online (Sandbox Code Playgroud)

如果您更愿意指定特定版本,请查看此处:https : //mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime


Leo*_*ray 5

此问题的根本原因是 Gradle Daemon 使用 JDK11,或者您将 JAVA_HOME 设置为 JDK11,或者您在与 JDK11 一起运行的共享守护程序中运行您的 Gradle 任务。

对于安卓:

  1. 检查您的项目结构设置,您可以从那里将 JDK 更改为 JDK8。

  2. 您还可以设置一个 JAVA_HOME 并指向 java8 home。


Sup*_*Yao 5

如果您使用的是 JDK 11,则只需将以下内容添加到 Gradle(应用程序)中:

dependencies {
    ...
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用。