GeXiangDong

精通Java、SQL、Spring的拼写,擅长Linux、Windows的开关机

0%

Java9: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

问题表现

在老程序升级到java9或以后版本时,如果遇到 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:645) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:475) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]

原因

这是由于JAXB API没找到造成的。 JAXB 在是 Java EE API的一部分,在java9开始不再包含在默认的java9的module中(java9开始分module了),甚至在java11开始,干脆把它给移除出JDK了。

解决方法

知道了原因解决办法也就有了:

  • 继续用Java8
  • 命令后增加 add-modules java.xml.bin,这个方法只对 java9 java10有效
  • 一劳永逸的解决问题(对9和以后版本都生效)增加maven依赖(或者gradle)
1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>

<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>

其它

这篇文章:org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat也遇到过相同的JAXBException,解决方式类似。