11

module-info.java我得到错误

包“com.example”从“javafx.base”和“javafx.base”中读取包“javafx.beans”。

迁移(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;
}

有人可以向我解释编译器想通过这个告诉我什么吗?

4

2 回答 2

12

使用所需的依赖项列表,如果您从 中删除所有必需的模块module-info,IDE 仍然会报同样的错误:

模块“”从“javafx.base”和“javafx.base”读取包“javafx.beans”

所以问题不在于您的模块信息,而在于您的依赖项。如果您注释掉所有这些,除了 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.basemodule-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 回答
2

错误显示,您最终在 JavaFX 的模块路径中放置了两次相同的模块

您可能已经将jmodsOpenJFXOpenJFXSDK/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
}

编辑 3 [动手]

您示例中的实际罪魁祸首是依赖项

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

禁用此功能可解决此问题。您可能希望将它提升给库所有者(或者如果您拥有它,则修复此问题)以确保它不会带来javafx.base模块。确切地说,这种依赖关系将org.openjfx:javafx-base:linux:11.0.1作为依赖关系引入,原因在它们的pom.xml依赖关系中很清楚。

于 2018-11-30T01:38:24.280 回答