如何解决java.lang.NoClassDefFoundError:javax/xml/bind/jaxBeException

如何解决java.lang.NoClassDefFoundError:javax/xml/bind/jaxBeException,java,jaxb,java-9,java-11,java-10,Java,Jaxb,Java 9,Java 11,Java 10,我有一些使用JAXB API类的代码,这些类是作为Java6/7/8中JDK的一部分提供的。当我使用Java9运行相同的代码时,在运行时会出现错误,表明找不到JAXB类 JAXB类自Java 6以来一直作为JDK的一部分提供,那么为什么Java 9不能再找到这些类呢?JAXB API被认为是Java EE API,因此不再包含在Java SE 9的默认类路径中。在Java11中,它们完全从JDK中删除 Java9引入了模块的概念,默认情况下,Java.seaggregate模块在类路径(或者更确

我有一些使用JAXB API类的代码,这些类是作为Java6/7/8中JDK的一部分提供的。当我使用Java9运行相同的代码时,在运行时会出现错误,表明找不到JAXB类


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

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

Java9引入了模块的概念,默认情况下,
Java.se
aggregate模块在类路径(或者更确切地说,模块路径)上可用。顾名思义,
java.se
aggregate模块不包括传统上与Java6/7/8捆绑在一起的JavaEEAPI

幸运的是,JDK 6/7/8中提供的这些JavaEEAPI仍然在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
有关JAXB的更多详细信息,请参阅

有关Java模块化的完整详细信息,请参阅

适用于Gradle或Android Studio开发者:(JDK 9及更高版本)

将以下依赖项添加到
build.gradle
文件中:

dependencies {
    // JAX-B dependencies for JDK 9+
    implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
    implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}

在编译和运行时,添加开关
——addmodules java.xml.bind

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

java --add-modules java.xml.bind <class file>
javac——添加模块java.xml.bind
java——添加模块java.xml.bind
关于
JDK 9
模块的详细介绍,请访问: 这对我很有效:

<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>

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

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

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

到目前为止,这是一个很好的解决方案。虽然看起来不是一个完美的解决方案…

对于Java Web Start执行,我们可以使用Andy Guibert的建议,如下所示:

<!-- 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>
<j2se version="1.6+" 
      java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>

请注意--add模块中的额外“=”。请参阅或的“了解运行时访问警告”中的最后一个注释。

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

例如:
java--addmodules=java.xml.bind XmlTestClass

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

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

javax.xml.bind
jaxb api
2.3.1

这对我很有效。仅仅添加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>

javax.xml.bind
jaxb api
${jaxb api.version}
com.sun.xml.bind
jaxb impl
${jaxb api.version}
com.sun.xml.bind
jaxb内核
${jaxb api.version}

不是答案,而是一个附录:我得到的答案是,如果JAVA HOME指向JAVA 9安装(
JAVA版本“9.0.1”
),那么运行
groovysh
(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

而且它有效

在最近的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>

javax.xml.bind
jaxb api
2.3.0
com.sun.xml.bind
jaxb impl
2.3.0
org.glassfish.jaxb
jaxb运行时
2.3.0
javax.activation
激活
1.1.1

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

  • javax.activation-1.2.0.jar

  • jaxb-api-2.3.0.jar

  • jaxb-core-2.3.0.jar

  • jaxb-impl-2.3.0.jar

  • 下载上述文件并将其复制到项目的libs文件夹中
  • 在Java构建路径中添加导入的JAR文件

  • 好吧,我也遇到过同样的问题,但我使用的是Java8,并且不断出现这个错误,我尝试了大多数解决方案。但事实证明,我的maven仍然指向Java9,即使我将全局java版本设置为8,只要我修复了所有问题,就可以了


    对于任何可能有此类问题的人,请查看2019年4月的更新

    JAXB版本的Changelong位于

    摘录:

        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
    
    权威链接位于

    JAXB工件的Maven坐标

    bind:jakarta.xml.bind-api:JAXB的api类。要求的 根据JAXB编译

    jaxb:jaxb运行时:jaxb的实现,使用的运行时 用于序列化和反序列化xml中的java对象

    JAXB fat jar包:

    bind:jaxb impl:jaxb运行时fat 罐子

    相比之下 对于org.glassfish.jaxb工件,这些jar具有所有依赖性 课程包括在内。这些工件不包含JPMS模块 描述符。 在Maven项目中,org.glassfish.jaxb工件是 应该用它来代替

    jaxb:jaxb运行时:jar:2.3.2拉入:

    [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
    
    原始答案

    在Maven中,您可以使用以下配置文件:

    <profile>
        <id>java-9</id>
        <activation>
            <jdk>9</jdk>
        </activation>
        <dependencies>
            <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>
    </profile> 
    

    要在Eclipse中使用此配置文件,请说Oxygen.3a发行版(4.7.3a)或更高版本,按住Ctrl-Alt-p键,或右键单击项目Maven,然后选择配置文件。

    转到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'
    

    我遵循这个URL,下面的设置对我很有帮助。我在MacBookPro中使用Java10和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>
    
    
    javax.xml.bind
    jaxb api
    2.3.0
    org.glassfish.jaxb
    jaxb运行时
    2.3.0
    运行时
    javax.act
    
    <profile>
        <id>java-9</id>
        <activation>
            <jdk>9</jdk>
        </activation>
        <dependencies>
            <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>
    </profile> 
    
    [INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
    [INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
    [INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
    [INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
    [INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
    [INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
    [INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
    [INFO] \- javax.activation:activation:jar:1.1.1:compile
    
    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'
    
       <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>
    
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
    
    <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>
    
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
    </dependency>
    
    <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>
    
            <!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.2.8</version>
            </dependency>
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-core</artifactId>
                <version>2.2.8-b01</version>
            </dependency>
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.2.8-b01</version>
            </dependency>
            <!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->
    
    plugins {
          id 'java'
    }
    
    dependencies {
          runtimeOnly 'javax.xml.bind:jaxb-api:2.3.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>
    
    // 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"
    }
    
    dependencies {
        implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")
    
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
    </dependency>
    
    implementation("org.glassfish.jaxb:jaxb-runtime")
    
    implementation 'org.glassfish.jaxb:jaxb-runtime'
    
    java --version
    
    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)
    
    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
    
    sudo mv jaxb-api-2.4.0-b180830.0359.jar jaxb-api.jar
    
    sudo chown -R tomcat:tomcat /opt/tomcat
    sudo chmod -R 777 /opt/tomcat/
    
    sudo systemctl restart tomcat
    
            <!-- 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>