Подтвердить что ты не робот

Как разрешить модуль читает ошибку пакета в java9

Я пытаюсь понять новую модульность в java 9 с помощью spring -boot, поэтому я хочу запустить некоторое простое приложение, например: 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
4b9b3361

Ответ 1

Проблема заключается в том, что ваш путь к модулю содержит один и тот же пакет (javax.annotation) в разных модулях (java.xml.ws.annotation и tomcat.embed.core), которые система модуля запрещает, чтобы сделать конфигурации более надежными, Это называется разделом . Система модулей сообщает вам, когда перечисляете все модули, которые читают (т.е. "См." ) Этот пакет дважды. Итак, что теперь делать?

Первый порядок ведения бизнеса состоял бы в том, чтобы проверить, содержат ли оба пакета одни и те же классы. Если да, то вам повезло. Теперь все, что вам нужно сделать, это убедиться, что в модульной системе видна только одна из тех, для которой есть две возможности:

  • Если из одного из модулей вам нужен только один пакет и ничего больше, выньте его из своей конфигурации и используйте вместо него другой. Возможно, вы можете явно запретить java.xml.ws.annotation?
  • Если вы поместите tomcat.embed.core в путь класса, его версия пакета будет полностью проигнорирована, и вся система, включая код в пути класса, увидит только пакет в java.xml.ws.annotation.

Если оба варианта пакета содержат типы, которые (а) другие не содержат, и (б) ваше приложение нуждается, вы находитесь в более жесткой ситуации. Прежде всего, это вызывает подозрение, что tomcat.embed.core сделал что-то подозрительное (хотя я не уверен в этом). Единственное, что я знаю, может помочь нестандартная javac опция --patch-module.

Ответ 2

В случае 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>

Ответ 3

Я получил следующую ошибку:

Модуль [ERROR] hibernate.core считывает пакет org.hibernate.dialect как из ParentProject, так и из hibernate.core

при попытке выполнить mvn clean install для моего проекта ParentProject. Автогенерация module-info.java для ParentProject содержала записи

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

module-info.java of ChildProject содержит

requires hibernate.core;

Удаление строки exports hibernate.core; из ParentProject разрешило проблему для меня.

= > Будьте осторожны с автоматически сгенерированным модулем -info.java в Eclipse.