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

标签 java java-module java-11 java-platform-module-system javafx-11

module-info.java 中我得到错误

Package 'com.example' reads package 'javafx.beans' from both 'javafx.base' and '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;
}

谁能给我解释一下编译器想通过这个告诉我什么?

最佳答案

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

Module '' reads package 'javafx.beans' from both 'javafx.base' and 'javafx.base'

所以问题不在您的模块信息中,而在您的依赖项中。如果您注释掉所有这些,除了 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需要 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 的模块信息更改为:

`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文档已经使用了这个插件。

关于java - 包 'com.example' 从 'javafx.beans' 和 'javafx.base' 读取包 'javafx.base',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53548096/

相关文章:

java - Mac OS上的OpenJDK8和JavaFX

java - RPG多种状态效果

java - 绘制用户选择的形状

java - android 用相机拍摄多张图像

java - 如何修复测试依赖项中的拆分包?

Java 9 模块和类路径 hell : conflicting class names

Intellij IDEA 中的 Java 11 JShell

java - 由 Runtime exec 运行时的外部程序 block

java - 如何在 Java9 模块中使用 3rd 方库?

java - 如何在 SBT 中创建拼图模块?