11

module-info.java私はエラーを取得します

パッケージ「com.example」は、「javafx.base」と「javafx.base」の両方からパッケージ「javafx.beans」を読み取ります。

移行 (Java 8 から Java 11 へ) がゆっくりと、しかし確実に私をイライラさせるだけでなく、このエラーは私には意味がありません。

my の依存関係部分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;
}

コンパイラがこれによって私に伝えたいことを誰かが私に説明できますか?

4

2 に答える 2

12

必要な依存関係のリストを使用して、必要なモジュールをすべて から削除してもmodule-info、IDE は同じエラーを表示します。

モジュール '' は、パッケージ 'javafx.beans' を 'javafx.base' と 'javafx.base' の両方から読み取ります

したがって、問題はモジュール情報ではなく、依存関係にあります。JavaFX 以外のすべてをコメントアウトすると、問題はなくなります。

これは、一部の依存関係が不要な JavaFX 依存関係を持っていることを意味します。

最初の依存関係のみをコメントすることで、問題を切り分けることができました。

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

問題は、なぜこれが起こっているのか、どうすれば修正できるのかということです。

Maven Centralリポジトリに移動すると、依存関係 の GitHub リポジトリが表示されbuild.gradleファイルとそのmodule-info.

予想どおり、JavaFXを使用します。

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

またrequires javafx.base、そのmodule-infoにも含まれています。

依存関係でこのアーティファクトを使用するとjavafx.base、JavaFX 依存関係からのインポートと共に、それらのインポートがインポートされ、競合が発生します。

この問題を解決する最速の方法は、ビルドでこれを変更することです。

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

これに:

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

したがって、JavaFX の依存関係を除外し、独自のものを使用します。

より恒久的な修正として、 artifactorg.transentials:cardhouse-commonsの module-info を次のように変更します。

`requires transitive javafx.base`

transitive ここでの使用について読むことができます。

問題は作成者に報告する必要があります。

ノート

余談ですが、javafxgradleプラグインを使用して、ビルドの関連するすべての 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ドキュメントはすでにこのプラグインを利用しています。

于 2018-11-30T17:13:04.150 に答える