ClassNotFoundException for javax.xml.bind.JAXBException with Spring Boot when switch to Java 9

后端 未结 6 1851
闹比i
闹比i 2020-12-14 16:00

Initialized the project using start.spring.io

Added WEB,JPA,H2 dependencies then tried to run the MainApplication.java using Jdk

相关标签:
6条回答
  • 2020-12-14 16:23

    Added below dependency and resolve the issue

    <dependency>
        <groupId>javax.xml.bind</groupId>
         <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
     </dependency>
    
    0 讨论(0)
  • 2020-12-14 16:24

    @Ratha : For Java12 (referred to your comment) this dependency list works:

        <dependencies>
            <...>
            <dependency>
                <groupId>com.sun.activation</groupId>
                <artifactId>javax.activation</artifactId>
                <version>1.2.0</version>
            </dependency>
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>2.3.1</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    
    0 讨论(0)
  • 2020-12-14 16:29

    You need to add the JAXB dependency (as not provided any longer by default in Java 9) and you have to use Spring Boot 2 :

    <dependency>
        <groupId>javax.xml.bind</groupId>
         <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
     </dependency>
    

    Note that if you use Java 10, you would have exactly the same issue as the JAXB dependency removal was not done just for the Java 9 version.


    The Spring Boot wiki about Java 9 and above lists things that you need to know to run Spring Boot apps on Java 9 and above.

    Spring Boot version requirements

    • Spring Boot 1 doesn't support it (and no planned to).
    • Spring Boot 2 supports it.

    Spring Boot 2 is the first version to support Java 9 (Java 8 is also supported). If you are using 1.5 and wish to use Java 9 you should upgrade to 2.0 as we have no plans to support Java 9 on Spring Boot 1.5.x.

    Java 10 is supported as of Spring Boot 2.0.1.RELEASE while Java 11 is supported as of Spring Boot 2.1.0.M2.

    Some known workarounds

    AspectJ

    With Java 9, if you need to weave classes from the JDK, you need to use AspectJ 1.9. Spring AOP should work fine in most cases with AspectJ 1.8 (the default in Spring Boot 2.0).

    JAXB

    When upgrading you may face the following:

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

    Hibernate typically requires JAXB that’s no longer provided by default. You can add the java.xml.bind module to restore this functionality with Java9 or Java10 (even if the module is deprecated).

    <dependency>
        <groupId>javax.xml.bind</groupId>
         <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
     </dependency>
    

    As of Java11, the module is not available so your only option is to add the JAXB RI (you can do that as of Java9 in place of adding the java.xml.bind module:

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

    Lombok

    If you are using lombok, the managed version of Spring Boot may not work with the latest JDK. Check the Lombok web site and override its version if necessary.

    Some known limitations

    These libraries do not have full support for Java 9 yet:

    • Apache Cassandra, see #10453

    Please, don't hesitate to edit this post if changes occur about the Java 9 and above compatibility with Spring Boot.

    0 讨论(0)
  • 2020-12-14 16:30

    Add below maven dependencies in you pom.xml and the issue will get resolve. in Java9/10 JaxB modules has been removed, hence need to add manually.

    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.2.11</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
     <version>2.2.11</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.2.11</version>
     </dependency>
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>
    
    0 讨论(0)
  • 2020-12-14 16:30

    Or for Gradle add the dependency

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
    
    0 讨论(0)
  • 2020-12-14 16:42

    The accepted answer is right, just wanted to point out I was having the same issue during Tomcat 9 startup while migrating a web project to OpenJDK11. In my case got the following stack trace:

    SEVERE [main] com.sun.faces.config.ConfigureListener.contextInitialized Critical error during deployment:
           java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
                   at java.base/java.lang.Class.getDeclaredFields0(Native Method)
                   at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3061)
                   at java.base/java.lang.Class.getDeclaredFields(Class.java:2248)
                   at com.sun.faces.application.annotation.ManagedBeanConfigHandler.collectAnnotatedFields(ManagedBeanConfigHandler.java:245)
                   at com.sun.faces.application.annotation.ManagedBeanConfigHandler.getBeanInfo(ManagedBeanConfigHandler.java:154)
                   at com.sun.faces.application.annotation.ManagedBeanConfigHandler.process(ManagedBeanConfigHandler.java:140)
                   at com.sun.faces.application.annotation.ManagedBeanConfigHandler.push(ManagedBeanConfigHandler.java:126)
                   at com.sun.faces.application.annotation.AnnotationManager.applyConfigAnnotations(AnnotationManager.java:234)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.processAnnotations(AbstractConfigProcessor.java:449)
                   at com.sun.faces.config.processor.ManagedBeanConfigProcessor.process(ManagedBeanConfigProcessor.java:245)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.ValidatorConfigProcessor.process(ValidatorConfigProcessor.java:121)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.ConverterConfigProcessor.process(ConverterConfigProcessor.java:127)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.ComponentConfigProcessor.process(ComponentConfigProcessor.java:118)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:403)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:138)
                   at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:155)
                   at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:246)
                   at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:443)
                   at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:237)
                   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4684)
                   at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5147)
                   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
                   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
                   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
                   at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
                   at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1848)
                   at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
                   at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                   at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                   at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
                   at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
                   at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
                   at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
                   at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
                   at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                   at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
                   at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
                   at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
                   at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
                   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                   at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
                   at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
                   at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                   at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                   at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
                   at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
                   at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
                   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                   at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
                   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                   at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
                   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                   at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
                   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:343)
                   at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
           Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
                   at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
                   at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
                   ... 65 more
    

    Hope it helps

    0 讨论(0)
提交回复
热议问题