java - Gradle 无法使用 JavaFX 插件从 src/test 访问模块 src/main 中定义的类

标签 java gradle javafx junit java-module

我试图让我的测试类访问主类(在标准 gradle 设置中)。在我将我的主要类放入一个模块(对于 JavaFX)之前,它工作正常,此时所有测试都停止工作。主代码运行良好。

如果我没理解错的话,根据this gradle documentation ,什么也不做应该可以正常运行测试,但是我得到一个错误:

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not complete execution for Gradle Test Executor 1.
    ...
Caused by: java.lang.IllegalAccessError: class org.junit.platform.launcher.core.LauncherFactory (in unnamed module @0x50650eec) cannot access class org.junit.platform.commons.util.Preconditions (in module org.junit.platform.commons) because module org.junit.platform.commons does not export org.junit.platform.commons.util to unnamed module @0x50650eec

如果我使用 intellij 配置,或运行 ./gradlew test,就会发生这种情况。

所以我尝试通过 patching the module-info 解决这个问题,但后来我遇到了数百个这样的错误:

error: cannot find symbol
import snake.Snake
            ^
  symbol:   class Snake
  location: package snake

IntelliJ 用 Package 'snake' 解释是在模块 'snakegame' 中声明的,它不会将其导出到模块 'snakegame'。我猜它指的是在 src/main/java 中定义的原始 module-info.java,以及在 src/test/java 中定义的辅助 module-info.java。

Gradle documentation它有一个代码片段,用于在 build.gradle 中自己添加补丁参数,但这只会导致此错误:

> java.lang.IllegalArgumentException: error: --patch-module specified more than once for module snakegame

实际执行的命令是这样的:

任务 compileTestJava 的编译器参数:[--patch-module, snakegame=/project/path/snake/build/classes/java/main, --module-path, ... , --add-模块,org.junit.jupiter.api,--add-reads,snakegame=org.junit.jupiter.api,--patch-module,snakegame=/project/path/snake/src/test/java]

所以它正在修补两个不同的模块,我不明白。这对我来说并不重要,我只需要这些类可以运行并且可以访问主类。

更新:

所以我重新创建了项目以尝试创建一个最小的可重现示例并一次添加一个元素,直到我添加 gradle JavaFX 插件时问题才出现,此时它停止工作。

所以我从默认结构开始,简单地创建了一个名为 example 的包和一个 Example.class,并在测试中创建了相同的包,带有一个测试类 Example_Test.class 包含一个创建 Example 对象的测试。然后我在 main 中添加了一个空的模块信息。原始build.gradle:

plugins {
    id 'java'
}
// default stuff

所以在这一点上,一切正常。然后我将其更改为:

plugins {
    id 'java'
    id 'org.openjfx.javafxplugin' version '0.0.9'
}

一切都停止了

最佳答案

我的首选解决方案是使用测试 module-info.java 或 module-info.test,但我无法让它工作。我结束了 simply ignoring modules对于测试,这是一个糟糕的解决方法,但目前有效。要在测试期间忽略模块,请将其添加到 build.gradle 中:

plugins {
    id 'java'
    id 'org.openjfx.javafxplugin' version '0.0.9'
    // other plugins
}

// other stuff

test {
    useJUnitPlatform()

    moduleOptions {
        runOnClasspath = true
    }
}

test 中设置 moduleOptions { runOnClasspath = true }

有用的链接:

关于java - Gradle 无法使用 JavaFX 插件从 src/test 访问模块 src/main 中定义的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66268068/

相关文章:

JavaFX 11 : Add a graphic to a TitledPane on the right side

java - 模拟 JMS 消息源

java - 父模块中的 Gradle 依赖平台

java - Netbeans - input.hasNext() 在按下 ctrl+z 时什么都不做

java - 更新后-崩溃 com.google.android.gms :play-services:5. 2.8

android - Gradle 错误 : could not execute build using gradle distribution

从 java 7u21 迁移到更高版本时,Javafx 应用程序无法启动

java - 如何使用 JavaFX 在表头中正确调整自定义控件的大小?

java - 我相信 Playframework 使用的是 java 7,我得到了不支持的 Major.minor 版本 51.0

java - 激活和停用 ComboBox