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

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

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

1170627 次浏览

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

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

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

java.activationjava.corbajava.transactionjava.xml.bind  << This one contains the JAXB APIsjava.xml.wsjava.xml.ws.annotation

快速和肮脏的解决方案:(仅限JDK 9/10)

要使JAXB API在运行时可用,请指定以下命令行选项:

--add-modules java.xml.bind

但我仍然需要这个工作与Java8!!!

如果您尝试使用较旧的JDK指定--add-modules,它会爆炸,因为它是一个无法识别的选项。我建议两种选择之一:

  1. 您可以使用JDK_JAVA_OPTIONS环境变量设置任何仅Java9+的选项。该环境变量是Java9+的java启动器的自动读取
  2. 您可以添加-XX:+IgnoreUnrecognizedVMOptions以使JVM静默忽略无法识别的选项,而不是爆炸。但要小心!您使用的任何其他命令行参数将不再由JVM为您验证。此选项适用于Oracle/OpenJDK以及IBMJDK(从JDK 8sr4开始)。

替代快速解决方案:(仅限JDK 9/10)

请注意,您可以通过指定--add-modules java.se.ee选项使上述所有JavaEE模块在运行时可用。java.se.ee模块是一个包含java.se.ee以及上述JavaEE API模块的聚合模块。请注意,这是不适用于Java11,因为java.se.ee在Java11中被删除。


适当的长期解决方案:(JDK 9及更高版本)

上面列出的JavaEE API模块都标记为@Deprecated(forRemoval=true),因为它们是Java11中的计划移除。因此--add-module方法将不再适用于开箱即用Java11。

在Java11中,您需要做的是在类路径或模块路径上包含您自己的JavaEE 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>

有关JAXB的更多详细信息,请参阅JAXB参考实现页面

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

截至2022年7月,bind-api和jaxb-runtime的最新版本是4.0.0。所以你也可以使用

    <version>4.0.0</version>

…在这些依赖子句中。但是如果您这样做,包名已从javax.xml.bind...更改为jakarta.xml.bind...。您需要修改源代码以使用这些更高版本的JAR。

对于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"}

在编译时和运行时,添加开关--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

这对我有效:

<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所建议的,为了避免依赖于整个Eclipse Link库,您也可以只依赖于Eclipse Link 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'

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

此外,这需要在使用JAXB API之前的某个地方执行:

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

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

对于JavaWeb启动执行,我们可以像这样使用安迪·吉伯特的建议:

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

注意--add-模块中的额外“=”。请参阅这个OpenJDK票Java平台,标准版Oracle JDK 9迁移指南的“了解运行时访问警告”中的最后一个注释。

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

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

在我的情况下(弹簧启动脂肪罐)我只是添加以下pom.xml.

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

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

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

java.lang.reflect.InvocationTargetExceptionat 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/JAXBContextat 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

解决办法是:

打包成一个函数…

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; dolocal FQLIB="$BASE/jaxb-ri/lib/$LIB"if [[ -f $FQLIB ]]; thenexport CLASSPATH=$FQLIB:$CLASSPATHfidone}
extend_qzminynshg; unset extend_qzminynshg

它奏效了!

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

好吧,我一直有同样的问题,但我使用Java8,并不断得到这个错误,我尝试了大部分的解决方案,但事实证明,我的maven仍然指向java 9,即使我设置全局Java版本为8,只要我修复了它的工作。

对于任何可能有这种问题的人,请查看如何修复Maven使用默认Java(存档)

2019年4月更新

JAXB版本的Changelong是https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

摘录:

    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

权威链接在https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

JAXB工件的Maven坐标

jakarta.xml.bind:jakarta.xml.bind-api:JAXB的API类对JAXB进行编译。

org.glassfish.jaxb:jaxb-runtime:实现JAXB,使用运行时用于将java对象序列化和反序列化到/从xml。

JAXB脂肪罐包:

com.sun.xml.bind:jaxb-impl:JAXB运行时脂肪罐子。

相反org.glassfish.jaxb艺术品,这些罐子包含在里面的类。这些工件不包含JPMS模块描述符。在Maven项目中org.glassfish.jaxb工件是#36825;要使用

org.glassfish.jaxb: jaxb-runtime: 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中遵循在我的Maven项目中,我应该为JAXB RI使用哪些工件?,您可以使用如下配置文件:

<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,然后选择配置文件。

转到Build.gradle并添加Java9或Java10的依赖项。

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和下面的设置真的帮助了我。我在Macbook Pro中使用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>

我在Java11上使用Spring Boot2.0.5.RELEASE遇到了同样的问题。

仅添加javax.xml.bind:jaxb-api:2.3.0并不能解决问题。我还必须将Spring Boot更新到最新的Milestone2.1.0.M2,所以我假设这将在下一个正式版本中得到修复。

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

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

适用于所有JDK>=9的干净解决方案

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

  • 的jaxb-api
  • 一个jaxb实现

作为实现,我选择使用glassfish的参考实现来摆脱旧的com.sun类/库。因此,我在我的maven build中添加了

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

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

我最初depoloed到Tomcat 9,并意识到我需要7……我忘了映射我的类路径回到7版本在build.xml

希望这将在未来修复其他人的错误,谁能像我一样忽略这个简单的问题!

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

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

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

旧答案“切换到amazoncorretto解决了问题”新闻回答:我用的是corretto最新版,但是和jdk 1.8差不多。所以无论如何我们需要手动添加依赖项

这对我来说很有效,我有一个在Java8中编译的春季启动项目,但我不知道为什么有一天我的maven开始编译Java11,在Ubuntu中我曾经修复过它:

sudo update-java-alternatives  -l

这向我展示了我的PC上可用的JDK:

java-1.11.0-openjdk-amd64      1111       /usr/lib/jvm/java-1.11.0-openjdk-amd64java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64`

所以我最后运行这个命令来选择想要的:

sudo update-java-alternatives  -s java-1.8.0-openjdk-amd64

就是这样,更多的看一看如何使用命令更新选项

在编译Java8目标时需要使用的依赖版本。Java8、11和12 JRE中测试的应用程序。

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

对我来说,在Java11和Gradle中,这是成功的:

plugins {id 'java'}
dependencies {runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'}

您需要将jaxb依赖项添加到maven。glassfish实现版本2.3.2与新的jakarta EE jaxb api版本2.3.2完全兼容。

<!-- API --><dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>2.3.2</version></dependency>
<!-- Runtime --><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.2</version></dependency>

这解决了我在Java12上运行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>

如果您正在调用SOAP Web服务(例如,使用jaxws-maven-plugin),只需添加此依赖项,所有JAXB错误都会消失:

<dependency><groupId>org.glassfish.metro</groupId><artifactId>webservices-rt</artifactId><version>2.4.3</version></dependency>

Java13

我在将我的项目升级到java 11后遇到了类似的问题,然后修复它的是升级到Spring Boot 2.1.1,它显然支持java 11,这个帮助

SBT解决方案

libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"

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

// 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 Kotlinkapt "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 JavaannotationProcessor "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")

我还使用Java11Java11绊倒了ClassNotFoundException:javax.xml.bind.DatatypeConver

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

我尝试了所有这些东西来添加javax.xml.bind:jaxb-api或Spring Bootjakarta.xml.bind-api…我在jjwt版本0.10.0中找到了一个修复提示…但最重要的是,jjwt包现在被拆分了!

因此,检查此引用:https://github.com/jwtk/jjwt/issues/510

简单地说,如果你使用

java11和jjwt 0.9. x和您将面临ClassNotFoundException:javax.xml.bind.DatatypeConver问题,

去争取

jjwt版本0.11. x,但使用拆分的包:https://github.com/jwtk/jjwt#install

您不会找到更高版本的jjwt依赖项,因为它们拆分了包。

干杯。

官方留档所示:

升级时,您可能会面临以下情况:

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

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

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


Maven

<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId></dependency>

Gradle(build.gradle.kts):

implementation("org.glassfish.jaxb:jaxb-runtime")

Gradle(build.gradle)

implementation 'org.glassfish.jaxb:jaxb-runtime'

如果你想指定一个特定的版本,请看这里:https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime

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

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

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

我是这样解决的

这个问题通常是在类路径中缺少JAXB库(JavaXML绑定的体系结构)时引起的。JAXB包含在JavaSE 10或更早版本中,但它从Java11或更高版本的JavaSE中删除-移动到Jakarta EE项目下的JavaEE。

所以,我检查了我的Java版本:

java --version

它给了我这个输出

openjdk 11.0.8 2020-07-14OpenJDK 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)

所以我遇到了JAXB异常错误,因为我使用的是Java11,它没有JAXB库(JavaXML绑定架构),类路径中缺少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

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

sudo mv jaxb-api-2.4.0-b180830.0359.jar jaxb-api.jar

说明:确保更改权限允许tomcat访问文件并将所有权更改为tomcat

sudo chown -R tomcat:tomcat /opt/tomcatsudo chmod -R 777 /opt/tomcat/

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

sudo systemctl restart tomcat

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

仅此而已。

对我来说,它的简单解决方案(Mac用户)

  run in terminal -->   alias j8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8`;java -version"
then run -->          j8
thats it !!(now run your mvn commands)

或者你可以在上面设置你的.bash_profile

添加下面的依赖对我有用。

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

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

对于Android:

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

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

我想给这个异常一个简单易行的解决方案,只是降级Android Studio版本高达4.1.1或更低。确保你没有安卓工作室北极狐(2020.3.1)版本,因为最新版本不支持Android的旧项目。

我在App中遇到了同样的问题,其中模块级别build.gradle添加了视图绑定和数据绑定。

早些时候

viewBinding {enabled = true}
dataBinding {enabled = true}

已解决

dataBinding {enabled = true}

在项目级别build.gradle中,如下所示

classpath 'com.android.tools.build:gradle:3.6.3'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"

您可以使用此依赖项

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

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

dependencies {...annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"...}

它为我工作。

对我来说,Eclipse 2020-12(4.18.0)正在使用inbuild(org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre

在安装的JRE(我想要的)中将java更新为1.8后解决了这个问题。

希望有帮助。