我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
当前回答
由于JavaEE现在由https://jakarta.ee/管理,因此2.3.2的新Maven坐标为:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
第一个发布的jaxb。版本为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>
其他回答
您需要向maven添加jaxb依赖项。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>
我在App中遇到了同样的问题,在模块级别构建。gradle添加了视图绑定和数据绑定。
早些时候
viewBinding {
enabled = true
}
dataBinding {
enabled = true
}
解决
dataBinding {
enabled = true
}
在项目级构建中。Gradle使用如下
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"
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在运行时可用,请指定以下命令行选项:
——添加模块java.xml.bind
但我仍然需要这与Java 8一起工作!!
如果尝试使用较旧的JDK指定——add-modules,将会失败,因为它是一个无法识别的选项。我建议有两个选择:
您可以使用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中被删除了。
适当的长期解决方案:(JDK 9及以上版本)
上面列出的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:模块系统
截至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及以上版本)
将以下依赖项添加到构建中。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"
}
我在Debian 10中开发Java项目时遇到了这个问题。
每次我启动应用程序时,它都会在日志文件中抛出错误:
java.lang.NoClassDefFoundError: javax / xml /绑定/ 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库(用于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
然后我将它从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
这是所有。
SBT解决方案
libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"