web-dev-qa-db-ja.com

Java 9に切り替えると、Spring Bootでjavax.xml.bind.JAXBExceptionのClassNotFoundExceptionが発生する

start.spring.io を使用してプロジェクトを初期化しました

WEB、JPA、H2依存関係を追加し、MainApplication.Javaを使用してJdk 9を実行しようとし、以下を取得しましたエラーログ

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.10.RELEASE)

2018-02-26 16:23:33.973  INFO 3860 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication v0.0.1-SNAPSHOT on RAJAT-PC with PID 3860 (C:\Users\devra\Downloads\Compressed\demo\target\demo-0.0.1-SNAPSHOT.jar started by rajat in C:\Users\devra\Downloads\Compressed\demo\target)
2018-02-26 16:23:33.973  INFO 3860 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2018-02-26 16:23:34.254  INFO 3860 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1aa7ecca: startup date [Mon Feb 26 16:23:34 IST 2018]; root of context hierarchy
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/C:/Users/devra/Downloads/Compressed/demo/target/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-4.3.14.RELEASE.jar!/) to method Java.lang.ClassLoader.defineClass(Java.lang.String,byte[],int,int,Java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2018-02-26 16:23:38.429  INFO 3860 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$1c55a85e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-02-26 16:23:39.856  INFO 3860 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-02-26 16:23:39.888  INFO 3860 --- [           main] o.Apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-02-26 16:23:39.903  INFO 3860 --- [           main] org.Apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.27
2018-02-26 16:23:40.247  INFO 3860 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-02-26 16:23:40.247  INFO 3860 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 6024 ms
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-02-26 16:23:40.622  INFO 3860 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'webServlet' to [/h2-console/*]
2018-02-26 16:23:42.200  INFO 3860 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2018-02-26 16:23:42.263  INFO 3860 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
        name: default
        ...]
2018-02-26 16:23:42.591  INFO 3860 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.12.Final}
2018-02-26 16:23:42.607  INFO 3860 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2018-02-26 16:23:42.607  INFO 3860 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2018-02-26 16:23:42.653  WARN 3860 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
2018-02-26 16:23:42.669  INFO 3860 --- [           main] o.Apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-02-26 16:23:42.716  INFO 3860 --- [           main] utoConfigurationReportLoggingInitializer :

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-02-26 16:23:42.747 ERROR 3860 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1628) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:555) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:483) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:306) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:230) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:302) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:197) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.Java:1080) ~[spring-context-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:857) ~[spring-context-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:543) ~[spring-context-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:122) ~[spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:693) [spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.Java:360) [spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:303) [spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1118) [spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1107) [spring-boot-1.5.10.RELEASE.jar!/:1.5.10.RELEASE]
        at com.example.demo.DemoApplication.main(DemoApplication.Java:10) [classes!/:0.0.1-SNAPSHOT]
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62) ~[na:na]
        at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43) ~[na:na]
        at Java.base/Java.lang.reflect.Method.invoke(Method.Java:564) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.Java:48) [demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.Java:87) [demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.Java:50) [demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.Java:51) [demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
Caused by: Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
        at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.Java:43) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
        at org.hibernate.boot.MetadataSources.<init>(MetadataSources.Java:87) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.Java:179) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.Java:149) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.Java:54) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.Java:360) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.Java:382) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.Java:371) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.Java:336) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1687) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1624) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        ... 24 common frames omitted
Caused by: Java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
        at Java.base/Java.net.URLClassLoader.findClass(URLClassLoader.Java:466) ~[na:na]
        at Java.base/Java.lang.ClassLoader.loadClass(ClassLoader.Java:563) ~[na:na]
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.Java:94) ~[demo-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at Java.base/Java.lang.ClassLoader.loadClass(ClassLoader.Java:496) ~[na:na]
        ... 35 common frames omitted

その後、jdk 8に切り替えましたが、正常に動作しました。

Spring-boot 2.0.0 RC2でも同じことが起こります

Spring docが8または9であるために必要なJavaバージョンに言及したときにこれが起こる理由.

16
Rajat Verma

JAXB依存関係(Java 9でデフォルトで提供されなくなった)を追加する必要があり、Spring Bootを使用する必要があります 2:

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

Java 10を使用すると、Java 9バージョンだけでJAXB依存関係の削除が行われなかったのとまったく同じ問題が発生することに注意してください。


Java 9以降に関するSpring Boot wiki は、Java 9以降でSpring Bootアプリを実行するために知っておく必要があることをリストします。

Spring Bootバージョンの要件

Spring Boot 1はこれをサポートしていません(計画もしていません)。
Spring Boot 2はこれをサポートしています。

Spring Boot 2は、Java 9をサポートする最初のバージョンです(Java 8もサポートされています)。 1.5を使用しており、Java 9を使用する場合は、Spring Boot 1.5.xでJava 9をサポートする予定がないため、2.0にアップグレードする必要があります。

Java 10はSpring Bootの時点でサポートされています2.0.1.RELEASEwhile Java 11は、Spring Boot2.1.0.M2以降でサポートされています。

既知の回避策

AspectJ

Java 9では、JDKからクラスを作成する必要がある場合、AspectJ 1.9を使用する必要があります。 Spring AOPは、AspectJ 1.8(Spring Boot 2.0のデフォルト)でほとんどの場合正常に動作するはずです。

JAXB

アップグレードする際、次の問題に直面する可能性があります。

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

Hibernateは通常、デフォルトでは提供されなくなったJAXBを必要とします。 Java.xml.bindモジュールを追加して、Java9またはJava10でこの機能を復元できます(モジュールが非推奨の場合でも)。

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

Java11の時点では、モジュールは利用できないため、唯一のオプションはJAXB RIを追加することです(Java.xml.bindモジュールを追加する代わりに、Java9でそれを行うことができます:

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

ロンボク

Lombokを使用している場合、Spring Bootの管理バージョンが最新のJDKで動作しない場合があります。 Lombok Webサイトを確認し、必要に応じてそのバージョンをオーバーライドします。

いくつかの既知の制限

これらのライブラリは、まだJava 9を完全にはサポートしていません。

  • Apache Cassandra、#10453を参照

Spring BootとのJava 9以上の互換性について変更が生じた場合、この投稿を編集することをheしないでください。

48
davidxxx

以下の依存関係を追加し、問題を解決します

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

またはGradleの場合は依存関係を追加します

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
1
James Mudd

以下にmaven依存関係をpom.xmlに追加すると、問題は解決します。 Java9/10ではJaxBモジュールが削除されたため、手動で追加する必要があります。

<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