首页 文章

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

提问于
浏览
434

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

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

19 回答

  • 5

    我知道我迟到了,但我的错误最终需要一个不同的解决方案......超级简单

    我原先去了Tomcat 9并意识到我需要7 ...我忘了将我的类路径映射回build.xml中的7版本

    希望这将在未来修复别人的错误,他设法忽略了这个简单的问题,就像我一样!

  • 146

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

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

  • 4

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

    我发现这个依赖项列表足以使其正常运行,所以你 don't need 要明确指定 --add-module (尽管它是在这些依赖项's 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>
    
  • 6

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

    clean solution for all JDKs >= 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>
    

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

  • 54

    这对我有用 . 仅添加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>
    
  • 10

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

    <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
    
  • 7

    这对我有用:

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

    更新

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

    Maven

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.moxy</artifactId>
        <version>2.7.3</version>
    </dependency>
    

    Gradle

    compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
    

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

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

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

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

  • 14

    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
    

    Quick and dirty solution: (JDK 9/10 only)
    要在运行时使JAXB API可用,请指定以下命令行选项:
    --add-modules java.xml.bind

    But I still need this to work with Java 8!!!
    如果您尝试使用较旧的JDK指定 --add-modules ,它会爆炸,因为它是一个无法识别的选项 . 我建议两种选择之一:

    • 您可以通过检查 $JAVA_HOME/releaseJAVA_VERSION 属性来检查JDK版本,从而有条件地在启动脚本(如果有的话)中应用该参数 .

    • 您可以添加 -XX:+IgnoreUnrecognizedVMOptions 以使JVM静默忽略无法识别的选项,而不是炸毁 . 但要小心!您使用的任何其他命令行参数将不再由JVM验证 . 此选项适用于Oracle / OpenJDK以及IBM JDK(从JDK 8sr4开始)


    Alternate quick solution: (JDK 9/10 only)
    请注意,您可以通过指定 --add-modules java.se.ee 选项在运行时使所有上述Java EE模块可用 . java.se.ee 模块是一个聚合模块,包含 java.se.ee 以及上述Java EE API模块 .


    Proper long-term solution: (All JDK versions)

    上面列出的Java EE API模块都标记为 @Deprecated(forRemoval=true) ,因为它们在Java 11中是scheduled for removal . 因此, --add-module 方法将不再适用于Java 11开箱即用 .

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

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    

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

  • 2

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

    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
    </dependency>
    
  • 8

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

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    
  • 35

    好吧,我一直有同样的问题,但我使用的是java 8,并且不断收到此错误,我尝试了大多数解决方案 . 但事实证明我的maven仍然指向java 9甚至 - 虽然我将全局java设置为8,所以一旦我修复它一切正常,对于任何可能有这种问题的身体,请查看(如何修复Maven使用默认Java)https://blog.tompawlak.org/maven-default-java-version-mac-osx

  • 658

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

    单独添加 javax.xml.bind:jaxb-api:2.3.0 无法解决问题 . 我还必须将Spring Boot更新到最新的Milestone 2.1.0.M2 ,所以我认为这将在下一个正式版本中修复 .

  • 0

    对于Java Web Start Execution,我们可以使用AndyGuibert的建议是这样的:

    <j2se version="1.6+" 
          java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
    

    请注意--add-modules中的额外"=" . 请参阅this OpenJDK TicketJava Platform, Standard Edition Oracle JDK 9 Migration Guide的"Understanding Runtime Access Warnings"中的最后一个音符 .

  • 8

    在Maven中使用Which artifacts should I use for JAXB RI in my Maven project?之后,您可以使用以下配置文件:

    <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
    

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

  • 5

    不是答案,而是一个附录:我得到了因为运行 groovysh (Groovy 2.4.13),如果JAVA_HOME指向Java 9安装(确切地说 java version "9.0.1" )失败了:

    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
    

    解决方案是:

    • 转到github.io的JAXB Project("JAXB is licensed under a dual license - CDDL 1.1 and GPL 2.0 with Class-path Exception")

    • 下载 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
    

    它的工作原理!

  • 2

    为了解决这个问题,我在项目中导入了一些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-core-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

    • 下载上述文件并将其复制到项目中的libs文件夹中

    • 在Java Build Path中添加导入的JAR文件

  • 1

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

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

    有关 JDK 9 模块的详细介绍也可在以下网址找到:https://www.youtube.com/watch?v=KZfbRuvv5qc

  • 3

    我按照这个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>
    

相关问题