簡體   English   中英

java9中如何解決模塊讀取package錯誤

[英]How to resolve module reads package error in java9

我想了解 java 9 和 spring-boot 中的新模塊化,所以我想運行一些簡單的應用程序,例如: Z5E056C500A1C4B6A7110B50D807BADEovsky5Z://github-bootspring.com/tmaty

我正在使用 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 的情況下,我遇到了類似的問題。 有一個拆分包,包含在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>

我收到以下錯誤:

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

嘗試為我的項目ParentProject執行 mvn clean install 時。 ParentProject自動生成的module-info.java包含條目

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

module-info.javaChildProject包含

requires hibernate.core;

刪除行exports hibernate.core; ParentProject為我解決了這個問題。

=> 注意 Eclipse 中自動生成的 module-info.java。

這簡直……,太好了……

現在怎么辦?

在此處輸入圖像描述

我猜您根本無法在 Spring 引導應用程序中將 Swagger 用作模塊化應用程序,或者有人知道如何解決這個問題???

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM