如何在java9中解析模块读取包错误

我试图通过spring-boot来理解java 9中的新模块化,所以我想运行一些简单的应用程序,例如: https : //github.com/tmatyashovsky/java9-springboot

我正在使用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 

问题是你的模块路径在不同的模块( java.xml.ws.annotationtomcat.embed.core )中包含相同的包( javax.annotation ),模块系统禁止这些包以使配置更可靠。 这称为拆分包 。 当列出所有读取(即“看到”)该包两次的模块时,模块系统会告诉您。 那现在该怎么办?

第一项业务是检查两个包是否包含相同的类。 如果是的话,你很幸运。 现在您需要做的就是确保模块系统只能看到其中一个,有两种可能性:

  • 如果来自其中一个模块,您只需要一个软件包而不需要其他软件包,请将其从配置中取出并使用另一个软件包。 也许你可以停止明确要求java.xml.ws.annotation
  • 如果将tomcat.embed.core放在类路径上,它的版本将完全被忽略,整个系统( 包括类路径上的代码)只会在java.xml.ws.annotation中看到该包。

如果软件包的两个变体都包含(a)另一个不包含的类型和(b)您的应用程序需求,那么您处境更加艰​​难。 首先,这引起了人们的怀疑,即tomcat.embed.core做了一些可疑的事情(虽然我不确定)。 我所知道的唯一可以帮助的可能是非标准的javac选项--patch-module

在Spring Boot和嵌入式Tomcat的情况下,我遇到了类似的问题。 有一个split包,它包含在javax.annotation:javax.annotation-api以及org.apache.tomcat:tomcat-annotations-api

javax.annotation:javax.annotation-apiorg.springframework.boot:spring-boot-starter-web的传递依赖org.springframework.boot:spring-boot-starter-web

为了解决Spring Boot和嵌入式Tomcat的特殊情况,如下所示添加依赖项是解决方案。 我明确地删除了javax.annotation-api的依赖项。 这是有效的,因为tomcat-annotations-api提供了所有必需的包和类。

   org.springframework.boot spring-boot-starter-web    javax.annotation javax.annotation-api     org.apache.tomcat tomcat-annotations-api  

我收到了以下错误:

[ERROR]模块hibernate.core从ParentProject和hibernate.core中读取包org.hibernate.dialect

当我为我的项目ParentProject尝试执行mvn clean install时。 ParentProject的auto生成的module-info.java包含条目

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

module-info.javaChildProject包含

 requires hibernate.core; 

删除行exports hibernate.core; 来自ParentProject为我解决了这个问题。

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