Gradle + JavaFX + 模块系统:项目模块从模块路径中消失?

时间:2021-03-17 22:22:25

标签: java gradle javafx

我有一个 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。

0 个答案:

没有答案