当前位置: 首页 > 知识库问答 >
问题:

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

宿景曜
2023-03-14

模块信息中。java我得到了错误

包'com。示例“读取包”javafx。来自两个javafx的bean。base和javafx。基地'。

迁移(Java8到Java11)不仅让我感到缓慢,而且肯定地说,这个错误对我来说毫无意义。

我的构建的依赖项部分。格雷德尔

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个答案

林波鸿
2023-03-14

错误是,您已经在modulepath for JavaFX中放置了两次相同的模块。

您可能已经将OpenJFX的jmods以及OpenJFXSDK/lib放在了模块路径上。

javafx11运行时如下所示:

>

作为许多jmod和

作为maven central中的一组工件。

根据您计划如何构建您的应用程序——模块化还是非模块化——这三个中的任何一个都应该足够使用。

编辑1[概念改进]

在您的构建中。gradle,您只需要在

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

自模块开始,javafx。basejavafx。图形通过javafx控件在模块路径中传递。此外,您必须确保,鉴于这些依赖关系,您没有在项目设置下添加任何库

编辑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依赖中很明显。

封梓
2023-03-14

有了所需的依赖项列表,如果您从模块信息中删除所有必需的模块,IDE仍然会以相同的错误抱怨:

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

所以问题不在于模块信息,而在于依赖关系。如果您注释掉所有这些,除了JavaFX,问题就消失了。

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

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

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

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

如果您转到Maven Central repo,它将显示依赖项的GitHub repo,您可以在其中找到构建。gradle文件及其模块信息

正如所料,它使用JavaFX:

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

它还需要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-comons的模块信息更改为:

`requires transitive javafx.base`

您可以在这里阅读关于传递的使用。

应向提交人报告一个问题。

笔记

另外,您可以使用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文档已经使用了这个插件。

 类似资料: