包 'com.example' 从 'javafx.base' 和 'javafx.base' 中读取包 'javafx.beans'
Package 'com.example' reads package 'javafx.beans' from both 'javafx.base' and 'javafx.base'
在 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;
}
谁能给我解释一下编译器想通过这个告诉我什么?
错误显示,您最终在 JavaFX 的模块路径中两次放置了相同的模块 。
您可能同时放置了 OpenJFX 的 jmods
和 OpenJFX SDK/lib
在你的模块路径上。
The JavaFX 11 runtime is available as
a platform-specific SDK
as a number of jmods and
as a set of artifacts in maven central.
根据您计划构建应用程序的方式,这三个(之一)应该足以进一步使用 - modular 或 non-模块化。
编辑 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 [可扩展的改进]
按照 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 [动手]
你的例子中的真正罪魁祸首是依赖性
compile 'org.transentials:cardhouse-commons:1.1.1'
禁用此功能可解决此问题。您可能想将其提交给库所有者(或者如果您拥有它则修复此问题)以确保它不会带来 javafx.base
模块。确切地说,这种依赖性将 org.openjfx:javafx-base:linux:11.0.1
作为依赖性引入,原因在它们的 pom.xml
依赖性中很明确。
有了所需的依赖项列表,如果您从 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 it shows the 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
的模块信息更改为:
`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 文档已经使用了这个插件。
在 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;
}
谁能给我解释一下编译器想通过这个告诉我什么?
错误显示,您最终在 JavaFX 的模块路径中两次放置了相同的模块 。
您可能同时放置了 OpenJFX 的 jmods
和 OpenJFX SDK/lib
在你的模块路径上。
The JavaFX 11 runtime is available as
a platform-specific SDK
as a number of jmods and
as a set of artifacts in maven central.
根据您计划构建应用程序的方式,这三个(之一)应该足以进一步使用 - modular 或 non-模块化。
编辑 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 [可扩展的改进]
按照 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 [动手]
你的例子中的真正罪魁祸首是依赖性
compile 'org.transentials:cardhouse-commons:1.1.1'
禁用此功能可解决此问题。您可能想将其提交给库所有者(或者如果您拥有它则修复此问题)以确保它不会带来 javafx.base
模块。确切地说,这种依赖性将 org.openjfx:javafx-base:linux:11.0.1
作为依赖性引入,原因在它们的 pom.xml
依赖性中很明确。
有了所需的依赖项列表,如果您从 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 it shows the 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
的模块信息更改为:
`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 文档已经使用了这个插件。