根据here发布的项目,您打开项目时遇到的错误是:
包'javafx.beans.property'在模块'com.example.external.lib'中声明,它不会将它导出到模块'example.project'
这个错误的原因是你正在将一些包从javafx.base 添加到你的外部库,但是这些包没有被导出到使用这个库的项目中。 javafx.beans.property 包由外部模块在内部使用,但无法导出。
因此,这些是一些建议的更改,以使其发挥作用。
如果您正在创建模块化 jar(使用 module-info 类)作为另一个项目的依赖项,则不需要使用影子插件,也不需要 捆绑 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 依赖项。
请注意,如果您仍想对这个外部项目做影子 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 类。
不推荐使用影子 jar 来分发您的项目,但由于您有自动模块 (commons-lang3),因此您不能使用 jlink,除非您将其转换为显式模块(参见 @ 987654322@).