问题表现
在老程序升级到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 | <dependency> |
其它
在 这篇文章:org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat也遇到过相同的JAXBException,解决方式类似。