java - 如何解决java9中的模块读取包错误

标签 java spring-boot maven java-9 module-path

我正在尝试使用 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),模块系统禁止这样做,以使配置更可靠。这称为 split package 。当列出所有读取(即“看到”)该包两次的模块时,模块系统会告诉您同样多的信息。那么现在该怎么办?

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

  • 如果在其中一个模块中,您只需要一个包而无需其他任何东西,请将其从您的配置中取出并使用另一个包。也许您可以停止明确要求​​java.xml.ws.annotation
  • 如果将tomcat.embed.core放在类路径上,其包的版本将被完全忽略,整个系统,包括类路径上的代码将只能看到java.xml.ws.annotation中的包。

如果包的两个变体都包含 (a) 另一个不包含的类型以及 (b) 您的应用程序需要的类型,那么您的处境会更困难。首先,这让人怀疑 tomcat.embed.core 做了一些可疑的事情(尽管我对此不确定)。我知道唯一可以提供帮助的可能是 non-standard javac option --patch-module .

关于java - 如何解决java9中的模块读取包错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655282/

相关文章:

Eclipse 不显示包中的类

java - 使用xml将matlab类对象(或结构)导出到类似类的java对象中

java - 按特定顺序运行两个以上线程

java - 获取ManyToMany相关元素时语句关闭异常

java - spring boot 中的事务管理器和数据源 - spring data

maven - 前端 Maven 插件失败 npm 安装

带字边界的 Java 模式不起作用

java - Spring Boot 2.2.6 - 安全 |更新用户信息后如何更新Principal

java - Spring Boot中jar和war的区别?

java - 如何为我的 Maven 项目制作一个可运行的 jar?