Пакет 'com.example' считывает пакет 'javafx.beans' из обоих 'javafx.base' и 'javafx.base' - PullRequest
0 голосов
/ 30 ноября 2018

В module-info.java я получаю сообщение об ошибке

Пакет 'com.example' считывает пакет 'javafx.beans' из обоих 'javafx.base' и 'javafx.base'.

Мало того, что миграция (с Java 8 на Java 11) расстраивает меня медленно, но и верно, эта ошибка не имеет для меня никакого смысла.

Часть зависимостей для моего build.gradle:

def springFrameworkVersion = '5.1.2.RELEASE'
def hibernateVersion = '5.3.7.Final'
def junitJupiterVersion = '5.3.1'

dependencies {
  compile 'org.transentials:cardhouse-commons:1.1.1'
  compile 'ch.qos.logback:logback-classic:1.2.3'
  compile "org.springframework:spring-context:$springFrameworkVersion"
  compile "org.springframework:spring-jdbc:$springFrameworkVersion"
  compile "org.springframework:spring-orm:$springFrameworkVersion"
  compile "org.hibernate:hibernate-core:$hibernateVersion"
  compile 'org.apache.commons:commons-dbcp2:2.5.0'
  compile 'org.apache.commons:commons-lang3:3.8.1'
  compile 'commons-io:commons-io:2.6'
  compile 'com.h2database:h2:1.4.197'
  compile 'javax.xml.bind:jaxb-api:2.3.1'
  compile 'com.google.guava:guava:27.0-jre'
  compile 'org.flywaydb:flyway-core:5.2.1'
  compile 'javax.validation:validation-api:2.0.1.Final'
  compile "org.openjfx:javafx-base:11:$platform"
  compile "org.openjfx:javafx-graphics:11:$platform"
  compile "org.openjfx:javafx-controls:11:$platform"
  compile "org.openjfx:javafx-fxml:11:$platform"
  testCompile 'junit:junit:4.12'

  testCompile 'org.mockito:mockito-core:2.+'
  testCompile 'de.saxsys:jfx-testrunner:1.2'
  testCompile 'org.apache.commons:commons-text:1.6'
  testCompile "org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion"
  testCompile "org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion"
  testCompile 'org.hamcrest:hamcrest-all:1.3'
}

И module-info.java:

module open.terms.client.jfx {
  requires org.transentials.cardhouse.commons;
  requires com.google.common;
  requires org.apache.commons.lang3;
  requires org.hibernate.orm.core;
  requires java.persistence;
  requires slf4j.api;
  requires javafx.graphics;
  requires javafx.fxml;
  requires java.desktop;
}

Может кто-нибудь объяснить мне, что компилятор хочет сказать мне этим?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

При наличии необходимого списка зависимостей, если вы удалите все необходимые модули из module-info, среда IDE все равно будет выдавать сообщение об ошибке:

Модуль '' читает пакет 'javafx.beans 'из обоих' javafx.base 'и' javafx.base '

Так что проблема не в вашей информации модуля, а в ваших зависимостях.Если вы закомментируете все из них, кроме JavaFX, проблема исчезнет.

Это означает, что некоторая зависимость несет некоторую ненужную зависимость JavaFX.

Мне удалось изолировать проблемукомментируя только первую зависимость:

compile 'org.transentials:cardhouse-commons:1.1.1'

Итак, вопрос в том, почему это происходит и как мы можем это исправить.

Если вы перейдете в Maven Central repo он показывает GitHub репо зависимости, где вы можете найти файл build.gradle и его module-info.

Как и ожидалось, он использует JavaFX:

compile "org.openjfx:javafx-base:11:$platform"

, а также requires javafx.base в его module-info .

Когда вы используете этот артефакт со своими зависимостями, вы импортируете их javafx.base import вместе сс вашими из ваших зависимостей JavaFX и возникает конфликт.

Самый быстрый способ решить проблему - это просто изменить это в вашей сборке:

compile 'org.transentials:cardhouse-commons:1.1.1'

на это:

compile ('org.transentials:cardhouse-commons:1.1.1') {
    exclude group: 'org.openjfx'
}

, так что вы исключите его зависимости JavaFX и будете использовать свои.

Более постоянное исправление будет изменять артефакт org.transentials:cardhouse-commons 'module-info на:

`requires transitive javafx.base`

Вы можете прочитать об использовании transitive здесь .

О проблеме следует сообщить автору.

Примечание

В качестве отступления можно использовать плагин javafx gradle , чтобы позаботиться обо всех связанных частях JavaFX сборки, упрощая его до:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.5'
}

repositories {
    mavenCentral()
}

dependencies {
    compile ('org.transentials:cardhouse-commons:1.1.1') {
        exclude group: 'org.openjfx'
    }
    compile files('libs/cardhouse-commons-master-1.1.1.jar')
    ...
    compile 'javax.validation:validation-api:2.0.1.Final'
}

javafx {
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = 'open.terms.client.jfx.Main'

Документы OpenJFX уже используют этот плагин.

0 голосов
/ 30 ноября 2018

Ошибка гласит, что вы закончили тем, что поместили один и тот же модуль дважды в ваш путь модуля для JavaFX .

Скорее всего, вы могли бы разместить jmods для OpenJFX , а также OpenJFX SDK/lib на пути вашего модуля.

Среда выполнения JavaFX 11 доступна как

  • SDK для конкретной платформы

  • в виде числа jmod и

  • как набор артефактов в Maven Central.

Любой (один) из этих трех должен быть достаточным для работы в зависимости откак вы планируете создавать свое приложение - модульное или немодульное.

Редактировать 1 [Концептуальное улучшение]

В вашем build.gradle вам просто нужно иметь зависимости над

compile "org.openjfx:javafx-controls:11:$platform"
compile "org.openjfx:javafx-fxml:11:$platform"

, поскольку модуль, javafx.base и javafx.graphics транзитивно присутствует в пути модуля через javafx-controls все равно.Кроме того, вы должны убедиться, что с учетом этих зависимостей вы не добавляете никаких библиотек в Project Settings > Libraries.

Редактировать 2 [Расширяемое улучшение]

Следуя документации в OpenJFX , вы можете использовать плагин и избавиться от зависимостей openjfx

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.5'
}

javafx {
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

dependencies {
    // all dependencies except openjfx
}

Edit 3 [Hands on]

Фактическим виновником в вашем примере является зависимость

compile 'org.transentials:cardhouse-commons:1.1.1'

, отключение которой устраняет эту проблему.Возможно, вы захотите поднять ее владельцу библиотеки (или исправить это, если она у вас есть), чтобы убедиться, что он не несет с собой модуль javafx.base.Чтобы быть точным, эта зависимость включает в себя org.openjfx:javafx-base:linux:11.0.1 в качестве зависимости, причина которой ясна в их pom.xml зависимостях.

...