# NoClassDefFoundError: javax/xml/bind/DatatypeConverter
问题描述:
错误
NoClassDefFoundError: javax/xml/bind/DatatypeConverter
通常是因为javax.xml.bind
包不在 Java 11 及更高版本中可用。这个包包含了DatatypeConverter
类。如果你正在使用 Java 11 或更高版本,并且你的代码中使用了DatatypeConverter
,你可能会遇到这个错误。你可以考虑使用其他类,如java.util.Base64
,来替换DatatypeConverter
的功能。
如果不希望降低 jdk 版本而解决这个问题可以参考如下:
<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>com.sun.xml.bind</groupId> | |
<artifactId>jaxb-core</artifactId> | |
<version>2.3.0</version> | |
</dependency> | |
<dependency> | |
<groupId>javax.activation</groupId> | |
<artifactId>activation</artifactId> | |
<version>1.1.1</version> | |
</dependency> |
为什么添加该依赖就不会报错了呢?是什么原理?
答:
当你在项目中添加这些依赖时,你其实是在你的项目中引入了
javax.xml.bind.DatatypeConverter
类所在的库。这样,当你的代码试图访问DatatypeConverter
类时,JVM 就可以在你的项目的类路径中找到它,因此就不会抛出NoClassDefFoundError
错误了。具体来说,
javax.xml.bind.DatatypeConverter
类是在 Java 8 及更早版本的 JDK 中可用的,但在 Java 11 及更高版本中被移除了。这是因为 Java 9 引入了模块系统,一些以前的 Java EE 和 CORBA 模块(包括javax.xml.bind
)被标记为 “deprecated” 并在 Java 11 中被移除。当你添加了上述的 Maven 依赖后,这些被移除的类会被添加回你的项目中,因此你的代码可以在 Java 11 或更高版本中正常运行。这就是为什么添加这些依赖可以解决
NoClassDefFoundError: javax/xml/bind/DatatypeConverter
错误的原理。。