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
問題は、モジュールパスに同じパッケージ(javax.annotation
)異なるモジュール(Java.xml.ws.annotationおよびTomcat.embed.core)構成の信頼性を高めるために禁止されています。これは split package と呼ばれます。モジュールシステムは、そのパッケージを2回読み取った(つまり、「見る」)すべてのモジュールをリストするときに、同じように通知します。それでは、今何をすべきか?
ビジネスの最初の順序は、両方のパッケージに同じクラスが含まれているかどうかを確認することです。はいの場合、あなたは幸運です。ここで必要なのは、モジュールシステムがそれらのうちの1つだけを確認することです。これには2つの可能性があります。
パッケージの両方のバリアントに、(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-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>
次のエラーが発生しました:
[エラー]モジュール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に注意してください。