包'com.example'从'javafx.base'和'javafx.base'读取包'javafx.beans'

时间:2018-11-29 21:48:06

标签: java java-module java-11 jigsaw javafx-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;
}

有人可以告诉我编译器要通过这个告诉我什么吗?

2 个答案:

答案 0 :(得分:3)

有了必需的依赖项列表,如果您从module-info中删除所有必需的模块,则IDE仍会报错并显示相同的错误:

  

模块''从'javafx.base'和'javafx.base'读取包'javafx.beans'

所以问题不在您的模块信息中,而在您的依赖项中。如果您将所有注释都注释掉,除了JavaFX注释,问题就解决了。

这意味着某些依赖项带有一些不必要的JavaFX依赖项。

我设法通过仅注释第一个依赖项来隔离问题:

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

所以问题是为什么会发生这种情况以及我们如何解决它。

如果您转到Maven Central repo,它将显示依赖项的GitHub repo,您可以在其中找到build.gradle文件及其module-info

正如预期的那样,uses JavaFX:

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

module-info中的requires javafx.base

当您将这个工件与依赖项一起使用时,您将导入它们的javafx.base导入项以及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 here的用法。

应该向作者报告问题。

注意

顺便说一句,您可以使用javafx gradle plugin来处理构建中所有相关的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文档已经使用了此插件。

答案 1 :(得分:2)

错误显示,您最终将 相同的模块两次放入JavaFX的模块路径

可能是您已将OpenJFX的 jmods OpenJFX SDK/lib 放置在模块路径上。 / p>

  

JavaFX 11运行时的版本为

     
      
  • 特定于平台的SDK

  •   
  • 为许多jmod和

  •   
  • 作为Maven Central中的一组工件。

  •   

这三个中的任何一个都应该足以用于进一步工作,具体取决于您打算如何构建应用程序- modular non-modular。 < / p>

编辑1 [概念改进]

在您的build.gradle中,您只需要具有依赖项即可

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

由于模块javafx.basejavafx.graphics始终通过javafx-controls传递到模块路径中。另外,您必须确保,鉴于这些依赖性,您不会在Project Settings > Libraries下添加任何库。

编辑2 [可扩展的改进]

documentation at 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个[Hands on]

示例中的真正罪魁祸首是依赖关系

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

禁用此功能可解决此问题。您可能想将它提高给库所有者(或者,如果拥有它,则将其修复),以确保它不会与javafx.base模块一起使用。确切地说,此依赖项将org.openjfx:javafx-base:linux:11.0.1作为依赖项引入了其pom.xml依赖项中明确的原因。