我有一个 Gradle 6.7.1 Java 15 项目,我正在尝试从普通 Eclipse 迁移。该项目使用JavaFX。我按照 JavaFX 网站上的步骤操作,现在已经到达了这个 build.gradle:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.9'
}
repositories {
jcenter()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
version = '0.1'
javafx {
version = '15.0.1'
modules = [ 'javafx.controls', 'javafx.graphics' ]
}
application {
mainModule = 'sa2emu'
mainClass = 'klfr.sa2emu.viewers.JavaFX_SA2Emulator'
}
java {
modularity.inferModulePath = true
toolchain.languageVersion = JavaLanguageVersion.of(15)
}
compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.named('javadoc') {
options.encoding = 'UTF-8'
}
sourceSets {
main {
java {
srcDirs = ['src']
}
resources {
srcDirs = ['src']
}
output.resourcesDir = file('build/out/bin')
java.outputDir = file('build/out/bin')
}
}
run {
// jvmArgs = [
// '-Dfile.encoding=UTF-8',
// '--module-path', classpath.asPath,
// '--add-modules', 'ALL-MODULE-PATH',
// ]
}
tasks.named('run') {
standardInput = System.in
}
tasks.named('test') {
useJUnitPlatform()
}
这很好,但是在运行时(gradle run --info),我得到
Error occurred during initialization of boot layer
java.lang.module.FindException: Module sa2emu not found
sa2emu 是我项目的主要模块,你可以在上面的配置中看到。我已经扫描了 Gradle 生成的命令行,似乎我的项目模块不在巨大的 --module-path 列表中。如果我对 JVM 参数使用注释掉的手动覆盖,它仍然不会注册,因为它总是(尤其是使用 doFirst)将参数放在 JavaFX 添加的 --module-path 之前。似乎 Java 忽略了第一个 --module-path 或其他正在发生的事情,当然我只能猜测。 --module-path 中的路径是 Gradle 临时文件,所以我不能做任何 --list-modules 恶作剧来调试。
此外,虽然 Gradle 抱怨“没有 module-info.java”,但它确实存在,被放置在正确的位置(直接在 src 文件夹中)并被正确编译到目标目录中。 (我真的很好奇为什么 Gradle 设法以如此多无法解释的方式与模块系统混为一谈。JavaExec 甚至没有 modulepath 选项,但它确实有 classpath!)
不胜感激,如果这不起作用,我将切换回 Eclipse。