我有一些使用 JAXB API 类的代码,这些类在 Java 6/7/8 中作为 JDK 的一部分提供。当我使用 Java 9 运行相同的代码时,在运行时出现错误,表明找不到 JAXB 类。
JAXB 类自 Java 6 起就作为 JDK 的一部分提供,那么为什么 Java 9 不再能找到这些类呢?
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
快速而肮脏的解决方案:(仅限JDK 9/10)
要使 JAXB API 在运行时可用,请指定以下命令行选项:
--add-modules java.xml.bind
但我仍然需要它才能与 Java 8 一起使用!!!
如果您尝试--add-modules
使用较旧的 JDK 进行指定,它将崩溃,因为它是一个无法识别的选项。我建议以下两种选择之一:
JDK_JAVA_OPTIONS
您可以使用环境变量设置任何仅限 Java 9+ 的选项。Java 9+的启动器会自动读取此环境变量。java
-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 模块。请注意,这在 Java 11 上不起作用,因为java.se.ee
在 Java 11 中已被删除。
上面列出的 Java EE API 模块都已标记@Deprecated(forRemoval=true)
,因为它们计划在Java 11中删除。因此,该--add-module
方法将不再适用于开箱即用的 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>
有关 JAXB 的更多详细信息,请参阅JAXB 参考实现页面。
有关 Java 模块化的完整详细信息,请参阅JEP 261:模块系统
对于 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"
}
就我而言(spring boot fat jar),我只需将以下内容添加到 pom.xml 中。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
在最近的 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>
您需要在构建中添加两个依赖项
作为一个实现,我选择使用 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)
这对我有用:
<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:
马文
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
摇篮
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");
到目前为止效果很好,作为一种解决方法。虽然看起来不是一个完美的解决方案......
这是因为如果您使用的是 jdk 9 或更高版本的 java 版本,只需将其添加到您的 pom
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
为了解决这个问题,我在我的项目中导入了一些 JAR 文件:
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-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
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
在编译时以及运行时,添加开关--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
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 fat-jar 包:
com.sun.xml.bind:jaxb-impl:JAXB 运行时胖 jar。
与 org.glassfish.jaxb 工件相比,这些 jar 包含所有依赖类。这些工件不包含 JPMS 模块描述符。在 Maven 项目中,应该使用 org.glassfish.jaxb 工件。
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 项目中,我应该为 JAXB RI 使用哪些工件? 在 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>
依赖树显示:
[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,然后选择配置文件。
我还使用Java 11偶然发现了 ClassNotFoundException:javax.xml.bind.DatatypeConverter和
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
我在添加 javax.xml.bind:jaxb-api 或 spring boot jakarta.xml.bind-api 时尝试了所有这些东西。我在 jjwt 版本 0.10.0 中找到了修复提示 .. 但最重要的是,jjwt 包是现在分裂!
因此,请检查此参考:https ://github.com/jwtk/jjwt/issues/510
简单地说,如果你使用
Java11 和 jjwt 0.9.x 并且您面临 ClassNotFoundException:javax.xml.bind.DatatypeConverter 问题,
去做
jjwt 版本 0.11.x,但使用拆分包:https ://github.com/jwtk/jjwt#install
你不会找到更高版本的 jjwt 依赖项,因为它们拆分了包。
干杯。
您可以使用--add-modules=java.xml.bind
JVM 选项将 xml 绑定模块添加到 JVM 运行时环境。
例如:java --add-modules=java.xml.bind XmlTestClass
这对我有用。仅添加 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>
转到您的 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'
使用 JDK 9+ 时需要添加 JAX-B 依赖项。对于 Android Studio 用户,您需要将其添加到您build.gradle
的dependencies {}
块中:
// 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"
}
我在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
它给了我这个输出
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)
所以我遇到了JAXBException错误,因为我使用的是Java 11,它没有 JAXB 库(Java Architecture for XML Binding)在类路径中丢失。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/tomcat
sudo chmod -R 777 /opt/tomcat/
然后我重新启动了tomcat服务器:
sudo systemctl restart tomcat
资源:[已解决] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
就这样。
对于 Java Web Start Execution,我们可以像这样使用 Andy Guibert 的建议:
<j2se version="1.6+"
java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
请注意 --add-modules 中的额外“=”。请参阅此 OpenJDK Ticket或Java 平台标准版 Oracle JDK 9 迁移指南的“了解运行时访问警告”中的最后一条注释。
在 pom.xml 中添加 javax.xml.bind 依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
此问题的根本原因是使用 JDK11 的 Gradle 守护程序,您将 JAVA_HOME 设置为 JDK11 或在与 JDK11 一起运行的共享守护程序中运行 Gradle 任务。
对于安卓:
检查您的项目结构设置,您可以从那里将 JDK 更改为 JDK8。
您还可以设置一个 JAVA_HOME 并指向 java8 主目录。
由于 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>
这解决了我在 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>
我关注了这个 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>
2.0.5.RELEASE
我在 Java 11 上使用 Spring Boot 时遇到了同样的问题。
单独添加javax.xml.bind:jaxb-api:2.3.0
并不能解决问题。我还必须将 Spring Boot 更新到最新的 Milestone 2.1.0.M2
,所以我认为这将在下一个正式版本中修复。
添加以下依赖项对我有用。
<!-- 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>
正如官方文档所述:
升级时可能会遇到以下情况:
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>
摇篮(build.gradle.kts):
implementation("org.glassfish.jaxb:jaxb-runtime")
摇篮(build.gradle)
implementation 'org.glassfish.jaxb:jaxb-runtime'
如果您更愿意指定特定版本,请查看此处: https ://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime
不是答案,而是附录:我得到了因为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
解决方案是:
转到 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
它有效!
您只需要 1 个依赖项:
dependencies {
implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")
好的,我一直遇到同样的问题,但我使用的是 Java 8,并且一直收到此错误,我尝试了大多数解决方案。但事实证明,即使我将全局 Java 版本设置为 8,我的 maven 仍然指向 java 9,只要我修复它一切正常。
对于可能遇到此类问题的任何人,请查看如何修复 Maven 以使用默认 Java
旧答案“通过切换到 amazoncorretto 解决了问题” 新闻答案:我使用了 corretto latest ,但与 jdk 1.8 类似。所以无论如何我们需要手动添加依赖项
为 Java 8 目标编译时需要使用的依赖版本。在 Java 8、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 -->
对我来说,在 Java 11 和 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>
我想给出一个关于这个异常的简单易行的解决方案,只需将android studio 版本降级到 4.1.1 或更低。确保你没有android studio arctic fox (2020.3.1) 版本,因为最新版本不支持android的旧项目。
我知道我迟到了,但我的错误最终需要一个不同的解决方案......也超级简单
我最初部署到 Tomcat 9 并意识到我需要 7 ......我忘记将我的类路径映射回 build.xml 中的 7 版本
希望这将在将来解决其他人的错误,他们设法像我一样忽略了这个简单的问题!
在将我的项目升级到 java 11 后我遇到了类似的问题,然后修复它升级到 spring boot 2.1.1,它显然支持 java 11,这有帮助
libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"
你可以使用这个依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
这对我有用,我有一个用 Java 8 编译的 spring boot 项目,但我不知道为什么有一天我的 maven 开始用 Java 11 编译,在 Ubuntu 中我曾经修复它:
sudo update-java-alternatives -l
这向我展示了我电脑上的可用 JDK:
java-1.11.0-openjdk-amd64 1111 /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-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
就是这样,更多了解如何使用命令更新替代品
如果您仅通过添加此依赖项来调用 SOAP Web 服务(例如,使用jaxws-maven-plugin
),则所有 JAXB 错误都会消失:
<dependency>
<groupId>org.glassfish.metro</groupId>
<artifactId>webservices-rt</artifactId>
<version>2.4.3</version>
</dependency>
使用 Java 13 测试
对我来说它的简单解决方案(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 上面设置
我在应用程序中遇到了同样的问题,其中模块级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"