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进行指定,那么它将会爆炸,因为它是一个无法识别的选项.我建议两种选择之一:
JDK_JAVA_OPTIONS
的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模块.
适当的长期解决方案:(所有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:模块系统
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)
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)
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)
到目前为止工作得很好,作为一种解决方法.虽然看起来不是一个完美的解决方案......
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)
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
您需要为构建添加两个依赖项
作为一个实现,我选择使用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)
Fáb*_*nto 17
为了解决这个问题,我在项目中导入了一些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
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.bind
JVM选项将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)
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)
转到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)
对于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 Ticket或Java平台标准版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)
由于 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)
我在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.jar
为jaxb-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
就这样。
我希望这有帮助
不是答案,而是附录:我得到的结果是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)
它有效!
我遵循此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)
我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)
这解决了我在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)
正如官方文档所述:
升级时可能会遇到以下情况:
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
此问题的根本原因是 Gradle Daemon 使用 JDK11,或者您将 JAVA_HOME 设置为 JDK11,或者您在与 JDK11 一起运行的共享守护程序中运行您的 Gradle 任务。
对于安卓:
检查您的项目结构设置,您可以从那里将 JDK 更改为 JDK8。
您还可以设置一个 JAVA_HOME 并指向 java8 home。
如果您使用的是 JDK 11,则只需将以下内容添加到 Gradle(应用程序)中:
dependencies {
...
annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
...
}
Run Code Online (Sandbox Code Playgroud)
这个对我有用。
归档时间: |
|
查看次数: |
462980 次 |
最近记录: |