web-dev-qa-db-ja.com

Java9でモジュール読み取りパッケージエラーを解決する方法

Java 9とspring-bootの新しいモジュール性を理解しようとしているので、次のような簡単なアプリケーションを実行したいと思います。 https://github.com/tmatyashovsky/Java9- springboot

Java 9:でmaven 3.5.0を使用しています。

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
25
hudi

問題は、モジュールパスに同じパッケージ(javax.annotation)異なるモジュール(Java.xml.ws.annotationおよびTomcat.embed.core)構成の信頼性を高めるために禁止されています。これは split package と呼ばれます。モジュールシステムは、そのパッケージを2回読み取った(つまり、「見る」)すべてのモジュールをリストするときに、同じように通知します。それでは、今何をすべきか?

ビジネスの最初の順序は、両方のパッケージに同じクラスが含まれているかどうかを確認することです。はいの場合、あなたは幸運です。ここで必要なのは、モジュールシステムがそれらのうちの1つだけを確認することです。これには2つの可能性があります。

  • モジュールの1つから必要なのは1つのパッケージのみで、それ以外は何も必要ない場合は、構成から取り出して、代わりに他のパッケージを使用します。 Java.xml.ws.annotationを明示的に要求するのをやめることができますか?
  • クラスパスにTomcat.embed.coreを配置すると、パッケージのバージョンは完全に無視され、システム全体のコードが含まれますクラスパスは、Java.xml.ws.annotationのパッケージのみを参照します。

パッケージの両方のバリアントに、(a)他方には含まれていないタイプと(b)アプリケーションに必要なタイプが含まれている場合、より厳しい状況にあります。まず第一に、それはTomcat.embed.coreが怪しいことをしたという疑いを提起します(それについてはわかりませんが)。私が助けることができる唯一のことは 非標準javacオプション--patch-module

15
Nicolai

Spring Bootと組み込みTomcatの場合、同様の問題に直面しました。 javax.annotation:javax.annotation-apiorg.Apache.Tomcat:tomcat-annotations-apiに含まれる分割パッケージがあります。

javax.annotation:javax.annotation-apiは、org.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>
3
Erunafailaro

次のエラーが発生しました:

[エラー]モジュールhibernate.coreはParentProjectとhibernate.coreの両方からパッケージorg.hibernate.dialectを読み取ります

私のプロジェクトParentProjectに対してmvn clean installを実行しようとしたとき。自動生成されたmodule-info.Java for ParentProjectにはエントリが含まれていました

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

module-info.Java of ChildProjectを含む

requires hibernate.core;

行の削除exports hibernate.core;からParentProjectが問題を解決しました。

=> Eclipseで自動生成されるmodule-info.Javaに注意してください。

0
Stefan