我有一些使用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再也找不到这些类了呢?
当前回答
我在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
这是所有。
其他回答
如果你使用的是上面提到的JDK 8,请遵循以下步骤:
添加javax.xml.bind依赖项
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
清洁maven 安装maven
为Java 8目标编译时需要使用的依赖项版本。在Java 8、11和12 JREs中测试的应用程序。
<!-- 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 -->
对于我来说,Eclipse 2020-12(4.18.0)正在使用inbuild (org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre)
在安装的JREs(这是我想要的)中将java更新到1.8后解决了这个问题。
希望能有所帮助。
在编译和运行时,添加开关——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
您需要向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>