原因和简单介绍
我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的。当我使用Java 9+运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类。
自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?
使用Java 8构建将使您的代码编译为yes,但是当尝试在Java 9+上运行该编译代码时,它将失败,因为JAX-B不存在。
正如之前关于Java 11的一切内容中看到的那样,它不再支持Java EE模块。Java 11删除了对 java.xml.bind- 它定义了XML绑定的Java体系结构 (JAXB)API的支持
Java 11包javax.xml.bind不再存在。
Java 7版本:包含和工作
Java 8版本:包含和工作
Java 9版本:已弃用
Java 10版:已弃用
Java 11版本:已删除
SEVERE: StandardWrapper.Throwable
java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not presentat java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)at java.base/sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)at java.base/sun.reflect.generics.repository.ClassRepository.computeSuperInterfaces(ClassRepository.java:117)at java.base/sun.reflect.generics.repository.ClassRepository.getSuperInterfaces(ClassRepository.java:95)at java.base/java.lang.Class.getGenericInterfaces(Class.java:1138)at com.sun.jersey.core.reflection.ReflectionHelper.getClass(ReflectionHelper.java:533)at com.sun.jersey.core.reflection.ReflectionHelper.getClass(ReflectionHelper.java:529)at com.sun.jersey.core.spi.factory.ContextResolverFactory.getParameterizedType(ContextResolverFactory.java:202)at com.sun.jersey.core.spi.factory.ContextResolverFactory.init(ContextResolverFactory.java:89)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:801)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.startup.Catalina.start(Catalina.java:695)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBContextat org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1328)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)at java.base/java.lang.Class.forName0(Native Method)at java.base/java.lang.Class.forName(Class.java:398)at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114)... 59 more
解决方案
为了解决此问题,需要手动将以下JAXB Maven依赖项添加到项目中。
适当的长期解决方案:(JDK 9及更高版本)
<!-- jaxb模块引用 - start--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.0</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- jaxb模块引用 - end -->
将每个模块的JDK版本都修改到JDK8版本以下
参考链接:
https://stackoverflow.com/questions/43574426/how-to-resolve-java-lang-noclassdeffounderror-javax-xml-bind-jaxbexception-in-j
参考链接:
https://crunchify.com/java-11-and-javax-xml-bind-jaxbcontext/