2017-06-22 74 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。

相关问题