2017-06-22 49 views
12

我想了解的Java 9彈簧引導新的模塊化設計,所以我想運行例如一些簡單的應用程序包的錯誤:https://github.com/tmatyashovsky/java9-springboot如何解決模塊讀取java9

我使用maven 3.5.0與java 9:

Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T21:39:06+02:00) 
Maven home: ~/soft/apache-maven-3.5.0 
Java version: 9-ea, vendor: Oracle Corporation 
Java home: /usr/lib/jvm/java-9-oracle 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux", version: "4.4.0-79-generic", arch: "amd64", family: "unix" 

問題是我還是有一些例外。這是什麼意思,我該如何解決它?

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project api: Compilation failure: Compilation failure: 
[ERROR] module reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.core reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.jcl reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.aop reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.expression reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.starter.web reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.starter reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.autoconfigure reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.starter.logging reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module logback.classic reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module logback.core reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module slf4j.api reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jul.to.slf4j reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module log4j.over.slf4j reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.starter.json reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.databind reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.annotations reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.core reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.datatype.jdk8 reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.datatype.jsr310 reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jackson.module.parameter.names reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.boot.starter.tomcat reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module tomcat.embed.core reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module tomcat.embed.el reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module tomcat.embed.websocket reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module hibernate.validator reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module validation.api reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module jboss.logging reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module classmate reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.web reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.webmvc reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.context reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module spring.beans reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation 
[ERROR] module com.lohika.morning.java9modules.service reads package javax.annotation from both java.xml.ws.annotation and tomcat.embed.core 
+0

您使用的是JDK9的確切版本? – khmarbaise

+0

最新早期訪問 – hudi

+0

@hudi最近構建:jdk-9 + 175,你能確認嗎? – nullpointer

回答

8

的問題是,你的模塊的路徑包含在不同的模塊相同的包(javax.annotation)(java.xml.ws.annotationtomcat.embed.core),其中該模塊系統中禁止爲了使配置更可靠。這被稱爲split package。當列出所有讀取(即「看到」)該包兩次的模塊時,模塊系統會盡可能多地告訴你。那麼現在該怎麼做?

業務的第一順序是檢查兩個包是否包含相同的類。如果是的話,你很幸運。現在,所有你需要做的是確保模塊系統只能看到其中的一個,對此有兩種可能性:

  • 如果從一個模塊,你只需要一個包,沒有別的,把它而不是你的配置,並使用另一個。也許你可以停止明確要求​​java.xml.ws.annotation
  • 如果你把tomcat.embed.core類路徑上,其版本的包將被完全忽略和整個系統,包括類路徑上的代碼只能看到的Java包。 xml.ws.annotation

如果軟件包的兩種變體都包含(a)其他變體不包含和(b)您的應用程序需要的類型,則處於更嚴峻的情況。首先,這引起了懷疑tomcat.embed.core做了一些可腥的事(雖然我不確定)。我知道唯一可以幫助的可能是non-standard javac option --patch-module

1

在Spring Boot和嵌入式Tomcat的情況下,我遇到了類似的問題。有一個拆分包,包含在javax.annotation:javax.annotation-api以及org.apache.tomcat:tomcat-annotations-api中。

javax.annotation:javax.annotation-apiorg.springframework.boot:spring-boot-starter-web的傳遞依賴性。

爲了解決Spring Boot和嵌入式Tomcat的特殊情況,添加如下所示的依賴關係是解決方案。我明確地刪除了javax.annotation-api的依賴關係。這是可行的,因爲tomcat-annotations-api也提供所有必需的包和類。

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <!-- served by tomcat-annotations-api instead --> 
       <groupId>javax.annotation</groupId> 
       <artifactId>javax.annotation-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-annotations-api</artifactId> 
    </dependency> 
0

我得到了以下錯誤:

[錯誤]模塊hibernate.core來自ParentProject讀取包org.hibernate.dialect和hibernate.core

當試圖執行MVN乾淨安裝我的項目ParentProject。 自動生成module-info.javaParentProject包含的條目

... 
exports hibernate.core; 
... 
requires ChildProject; 
... 

的的ChildProjectmodule-info.java包含

requires hibernate.core; 

刪除線exports hibernate.core;ParentProject解決了這個問題對我來說。

=>在Eclipse中小心自動生成的module-info.java。