2016-09-14 42 views
7

Tôi đã xem xét hệ thống mô-đun ghép hình của JDK 9.Java 9 - REST với Spring 5 & Jigsaw - Có thể không?

Nó hoạt động khá độc đáo khi biên dịch từ dòng lệnh (ít nhất là quickstart không).

Nhưng tôi đang cố tạo một API REST đơn giản bằng cách sử dụng Spring và Jigsaw. Spring 5.0.0 M1 được cho là có

Full compatibility with JDK 9 as of July 2016

Tôi cũng muốn REST API làm việc với Maven. Theo this Maven page, Maven sẽ có thể làm việc với Java 9 (hoặc tôi đọc sai điều này?).

Khi có điểm JAVA_HOME tôi để JDK của tôi, tôi dường như không thể chạy mvn spring-boot:run trên ứng dụng Boot mùa xuân của tôi - nó ném rất nhiều trường hợp ngoại lệ, chẳng hạn như:

FoundError: javax/xml/bind/ValidationException 
2016-09-14 10:43:42.704 ERROR 120408 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

Chạy mvn -version mang lại cho tôi:

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00) 
Maven home: C:\Program Files\apache-maven-3.3.9\bin\.. 
Java version: 9-ea, vendor: Oracle Corporation 
Java home: C:\Program Files\Java\jdk-9 
Default locale: en_US, platform encoding: Cp1252 
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos" 

Hiện tại, bạn có thể tạo API REST này bằng Spring và Java 9 bằng Jigsaw không? Hoặc tôi nên gắn bó với Java 8 cho đến khoảng tháng 3/tháng 7 năm 2017?

Full chồng đổ:

2016-09-14 10:43:42.688 WARN 120408 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException:       Unable to start embedded container; nested exception is org.springframework.bea       ns.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedS       ervletContainerFactory' defined in class path resource [org/springframework/boot       /autoconfigure/web/EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat.clas       s]: Initialization of bean failed; nested exception is org.springframework.beans       .factory.UnsatisfiedDependencyException: Error creating bean with name 'org.spri       ngframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration': Unsatisfied d       ependency expressed through constructor parameter 0: Error creating bean with na       me 'spring.http.encoding-org.springframework.boot.autoconfigure.web.HttpEncoding       Properties': Initialization of bean failed; nested exception is java.lang.NoClas       sDefFoundError: javax/xml/bind/ValidationException; nested exception is org.spri       ngframework.beans.factory.BeanCreationException: Error creating bean with name '       spring.http.encoding-org.springframework.boot.autoconfigure.web.HttpEncodingProp       erties': Initialization of bean failed; nested exception is java.lang.NoClassDef       FoundError: javax/xml/bind/ValidationException 
2016-09-14 10:43:42.704 ERROR 120408 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory'       defined in class path resource [org/springframework/boot/autoconfigure/web/Embed       dedServletContainerAutoConfiguration$EmbeddedTomcat.class]: Initialization of be       an failed; nested exception is org.springframework.beans.factory.UnsatisfiedDepe       ndencyException: Error creating bean with name 'org.springframework.boot.autocon       figure.web.HttpEncodingAutoConfiguration': Unsatisfied dependency expressed thro       ugh constructor parameter 0: Error creating bean with name 'spring.http.encoding       -org.springframework.boot.autoconfigure.web.HttpEncodingProperties': Initializat       ion of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/xm       l/bind/ValidationException; nested exception is org.springframework.beans.factor       y.BeanCreationException: Error creating bean with name 'spring.http.encoding-org       .springframework.boot.autoconfigure.web.HttpEncodingProperties': Initialization       of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bi       nd/ValidationException 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:535) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at hello.Application.main(Application.java:10) [classes/:na] 
     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0([email protected]/Native Method) ~[na:na] 
     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke([email protected]/NativeMethodAccessorImpl.java:62) ~[na:na] 
     at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke([email protected]/DelegatingMethodAccessorImpl.java:43) ~[na:na] 
     at java.lang.reflect.Method.invoke([email protected]/Method.java:535) ~[na:na] 
     at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:483) [spring-boot-maven-plugin-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at java.lang.Thread.run([email protected]/Thread.java:843) [na:na] 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/EmbeddedServletContainerAut       oConfiguration$EmbeddedTomcat.class]: Initialization of bean failed; nested exce       ption is org.springframework.beans.factory.UnsatisfiedDependencyException: Error       creating bean with name 'org.springframework.boot.autoconfigure.web.HttpEncodin       gAutoConfiguration': Unsatisfied dependency expressed through constructor parame       ter 0: Error creating bean with name 'spring.http.encoding-org.springframework.b       oot.autoconfigure.web.HttpEncodingProperties': Initialization of bean failed; ne       sted exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationExcep       tion; nested exception is org.springframework.beans.factory.BeanCreationExceptio       n: Error creating bean with name 'spring.http.encoding-org.springframework.boot.       autoconfigure.web.HttpEncodingProperties': Initialization of bean failed; nested       exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:199) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:162) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
     ... 14 common frames omitted 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration': Unsatisfied dependency expressed through constructor para       meter 0: Error creating bean with name 'spring.http.encoding-org.springframework       .boot.autoconfigure.web.HttpEncodingProperties': Initialization of bean failed;       nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationExc       eption; nested exception is org.springframework.beans.factory.BeanCreationExcept       ion: Error creating bean with name 'spring.http.encoding-org.springframework.boo       t.autoconfigure.web.HttpEncodingProperties': Initialization of bean failed; nest       ed exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationExcepti       on 
     at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:372) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 

---- cắt đứt

Tóm tắt Lỗi:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin       
:1.4.0.RELEASE:run (default-cli) on project gs-rest-service: An exception occurr       
ed while running. null: InvocationTargetException: Unable to start embedded cont       
ainer; nested exception is org.springframework.beans.factory.BeanCreationExcepti  
on: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' define       
d in class path resource [org/springframework/boot/autoconfigure/web/EmbeddedSer 
vletContainerAutoConfiguration$EmbeddedTomcat.class]: Initialization of bean fai      
led; nested exception is org.springframework.beans.factory.UnsatisfiedDependency    
Exception: Error creating bean with name 'org.springframework.boot.autoconfigure  
.web.HttpEncodingAutoConfiguration': Unsatisfied dependency expressed through co       
nstructor parameter 0: Error creating bean with name 'spring.http.encoding-org.s   
pringframework.boot.autoconfigure.web.HttpEncodingProperties': Initialization of       
bean failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind       
/ValidationException; nested exception is org.springframework.beans.factory.Bean      
CreationException: Error creating bean with name 'spring.http.encoding-org.sprin    
gframework.boot.autoconfigure.web.HttpEncodingProperties': Initialization of bea       
n failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/Val       
idationException: javax.xml.bind.ValidationException -> [Help 1] 
+0

Thêm toàn bộ stack, chúng tôi thực sự muốn nhìn thấy gì ngoại trừ bạn đang nhận được. "Ứng dụng khởi động thất bại" là không sử dụng cho chúng tôi. – rorschach

+0

Chỉ cần loại bỏ ngoại lệ cấp thấp nhất. [Cách đọc một stacktrace] (https://bukkit.org/threads/how-to-read-stack-traces-and-troubleshoot-your-own-plugins-by-yourself.32457/) – rorschach

Trả lời

2
Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException: javax.xml.bind.ValidationException 

Bạn đang thiếu một sự phụ thuộc, đặc biệt this one.

+3

mà ngầm được gây ra bằng cách sử dụng Java 9 làm JDK, vì REST API này đang sử dụng Spring-boot và chưa có bản phát hành khởi động mùa xuân nào tương thích với JDK9/modules? Hay là có? – Ivaro18

+0

Bạn có thêm phụ thuộc không? Chuyện gì đã xảy ra? – rorschach

1

Vì bạn đang sử dụng mô-đun không mặc định bạn cần phải thêm nó bằng tay khi bạn biên dịch và chạy Java9:

javac --add-modules java.xml.bind ... 
java --add-modules java.xml.bind ... 

Nếu thiếu lớp java ee khác cố gắng thêm các mô-đun thùng:

--add-module java.se.ee 
0

câu trả lời của rorschach là không chính xác bởi vì ngoại lệ xác thực hibernate là trong một gói khác nhau, lớp khác nhau. Tôi không có đủ điểm đại diện để bình luận trực tiếp.

Câu trả lời của zhy2002 là chính xác cho trường hợp Java-9 nhưng sẽ không hoạt động cho Java 8 hoặc 10 (vì mô-đun ee java này không còn được dùng nữa và sẽ bị xóa trong 10).Nếu bạn muốn nó để làm việc với Java 8 và Java 9 như chúng tôi, bạn có thể thêm phụ thuộc này:

Gradle:

compile "javax.xml.bind:jaxb-api:2.3.0" 

Maven:

<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> 
<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId> 
    <version>2.3.0</version> 
</dependency> 

Xem ở đây:
How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

0

Trong trường hợp khởi động mùa xuân, bạn cần phải thêm vào maven pom:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <jvmArguments>--add-modules java.xml.bind</jvmArguments> 
     <mainClass>org.springframework.samples.petclinic.PetClinicApplication</mainClass> 
    </configuration> 
... 

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-jpa</artifactId> 
    <exclusions> 
     <exclusion> 
      <artifactId>javassist</artifactId> 
      <groupId>org.javassist</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>3.22.0-GA</version> 
    <scope>runtime</scope> 
</dependency> 

Xem https://blog.frankel.ch/migrating-to-java-9/2/

Các vấn đề liên quan