Error: "Package is declared 'javafx.beans.value' in module 'foo.bar'"
Error: "Package is declared 'javafx.beans.value' in module 'foo.bar'"
我开发了一个 module-info.java
看起来像这样的库:
module foo.bar {
requires org.apache.commons.lang3;
requires javafx.base;
requires java.validation;
exports foo.bar;
}
此库用于另一个项目,其中 module-info.java
包含以下内容:
module other.project {
requires org.apache.commons.lang3;
requires javafx.base;
requires javafx.graphics;
requires javafx.fxml;
requires foo.bar;
}
当我尝试使用 import javafx.beans.value.WritableValue;
时出现错误
Package javafx.beans.value
is declared in foo.bar
, which does not
export it to module other.project
.
更新: 我创建了两个重现问题的示例项目。请找到他们here下载。
我不明白这是为什么,但我找不到解决方案。
根据 here 发布的项目,您在打开项目时遇到的错误是:
Package 'javafx.beans.property' is declared in module 'com.example.external.lib', which does not export it to module 'example.project'
此错误的原因是您将 javafx.base
中的一些包添加到您的外部库中,但这些包没有导出到使用该库的项目中。 javafx.beans.property
包被外部模块内部使用,但是无法导出。
所以这些是一些建议的更改以使其正常工作。
如果你正在创建一个模块化的 jar(使用 module-info
class)作为另一个项目的依赖,你不需要使用 shadow 插件,你也不需要捆绑 jar 中的 JavaFX 依赖项。
- 外部图书馆项目
因此您可以拥有相同的 module-info.java
文件:
module com.example.external.lib {
requires javafx.base;
requires org.apache.commons.lang3;
exports com.example.external.library;
}
像这样 build.gradle
:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'com.google.osdetector'
apply plugin: 'java'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
现在,当您 运行 gradle build
时,您将生成 libs/external-library.jar
,一个 2 KB 的 jar,没有 JavaFX 依赖项。
请注意,如果您仍想使用此外部项目执行 shadow jar,您可以使用 compileOnly "org.openjfx:javafx-base:11:$platform"
将 JavaFX 依赖项排除在该 jar 之外。
- 使用外部库的项目
您可以将该 jar 添加到项目中。
build.gradle
:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'com.google.osdetector'
apply plugin: 'java'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile files('libs/external-library.jar')
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
但是现在您的 module-info
文件应该再次包含 javafx.base
依赖项:
module example.project {
requires javafx.base;
requires com.example.external.lib;
exports com.example.project;
}
您可以运行 gradle build
生成一个 jar,IntelliJ 不会再报错了。
如果你想在最后有一个影子罐子,你也可以申请:
buildscript {
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'application'
apply plugin: 'com.google.osdetector'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile files('libs/external-library.jar')
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
mainClassName = "com.example.project.PublicClass"
jar {
manifest {
attributes 'Main-Class': 'com.example.project.PublicClass'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
这样你就可以 运行 java -jar build/libs/project-using-external-lib.jar
。请注意,此 jar 将包含 JavaFX classes.
不推荐使用 shadow jar 来分发您的项目,但是由于您有自动模块 (commons-lang3),您不能使用 jlink
,除非您将其转换为显式模块(见此 )。
我开发了一个 module-info.java
看起来像这样的库:
module foo.bar {
requires org.apache.commons.lang3;
requires javafx.base;
requires java.validation;
exports foo.bar;
}
此库用于另一个项目,其中 module-info.java
包含以下内容:
module other.project {
requires org.apache.commons.lang3;
requires javafx.base;
requires javafx.graphics;
requires javafx.fxml;
requires foo.bar;
}
当我尝试使用 import javafx.beans.value.WritableValue;
时出现错误
Package
javafx.beans.value
is declared infoo.bar
, which does not export it to moduleother.project
.
更新: 我创建了两个重现问题的示例项目。请找到他们here下载。
我不明白这是为什么,但我找不到解决方案。
根据 here 发布的项目,您在打开项目时遇到的错误是:
Package 'javafx.beans.property' is declared in module 'com.example.external.lib', which does not export it to module 'example.project'
此错误的原因是您将 javafx.base
中的一些包添加到您的外部库中,但这些包没有导出到使用该库的项目中。 javafx.beans.property
包被外部模块内部使用,但是无法导出。
所以这些是一些建议的更改以使其正常工作。
如果你正在创建一个模块化的 jar(使用 module-info
class)作为另一个项目的依赖,你不需要使用 shadow 插件,你也不需要捆绑 jar 中的 JavaFX 依赖项。
- 外部图书馆项目
因此您可以拥有相同的 module-info.java
文件:
module com.example.external.lib {
requires javafx.base;
requires org.apache.commons.lang3;
exports com.example.external.library;
}
像这样 build.gradle
:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'com.google.osdetector'
apply plugin: 'java'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
现在,当您 运行 gradle build
时,您将生成 libs/external-library.jar
,一个 2 KB 的 jar,没有 JavaFX 依赖项。
请注意,如果您仍想使用此外部项目执行 shadow jar,您可以使用 compileOnly "org.openjfx:javafx-base:11:$platform"
将 JavaFX 依赖项排除在该 jar 之外。
- 使用外部库的项目
您可以将该 jar 添加到项目中。
build.gradle
:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'com.google.osdetector'
apply plugin: 'java'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile files('libs/external-library.jar')
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
但是现在您的 module-info
文件应该再次包含 javafx.base
依赖项:
module example.project {
requires javafx.base;
requires com.example.external.lib;
exports com.example.project;
}
您可以运行 gradle build
生成一个 jar,IntelliJ 不会再报错了。
如果你想在最后有一个影子罐子,你也可以申请:
buildscript {
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
}
}
apply plugin: 'application'
apply plugin: 'com.google.osdetector'
ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
compile files('libs/external-library.jar')
compile 'org.apache.commons:commons-lang3:3.8.1'
compile "org.openjfx:javafx-base:11:$platform"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.base'
]
}
}
mainClassName = "com.example.project.PublicClass"
jar {
manifest {
attributes 'Main-Class': 'com.example.project.PublicClass'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
这样你就可以 运行 java -jar build/libs/project-using-external-lib.jar
。请注意,此 jar 将包含 JavaFX classes.
不推荐使用 shadow jar 来分发您的项目,但是由于您有自动模块 (commons-lang3),您不能使用 jlink
,除非您将其转换为显式模块(见此