我一直在努力寻找一种干净的方法来处理 gradle 构建的模块化 Java FX 项目(使用 JDK11),它可以生成漂亮的可部署 jlink 映像,同时仍然能够在 Eclipse IDE 中执行 Junit 测试。我有:
plugins {
id 'java-library'
id 'application'
id 'eclipse'
id 'org.openjfx.javafxplugin' version '0.0.12'
id 'org.beryx.jlink' version '2.12.0'
}
dependences {
testImplementation 'junit:junit:4.13'
}
javafx {
version = "16"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
mainClassName = "{my-package}.App"
eclipse {
classpath {
file {
whenMerged {
entries.findAll { it.properties.kind.equals('lib') }.each { it.entryAttributes['module'] = 'true' }
}
}
}
}
jlink {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'mini'
}
}
通过此配置,我可以轻松地从 Eclipse 中运行我的 JavaFX 应用程序(使用 gradle -> 应用程序 -> 运行任务),并且可以构建一个可爱的可部署 jlink 映像(使用 jlink 任务)。然而,我无法在我的 IDE 中运行 JUnit 测试,我经常喜欢这样做来测试一些代码和代码想法——也许部分原因是我有点业余,尽管我有相当多的业余爱好。经验。
在互联网上搜索解决方案后,我最终尝试了各种方法,例如将“requires junit”添加到 info-module.java 文件中,摆弄构建路径配置以将 JUnit4 库添加到模块路径中(这显然会消失)每次我刷新gradle),并尝试JUnit5。我没有发现任何令人满意的事情。当然 Gradle (或者可能是 Eclipse 插件)应该有一个简洁的解决方案吗?这里有一个一刀切的解决方案吗?
经过一番折腾,我的解决方案是:
允许 JUnit 测试工作:
a.注释掉 module-info.java 文件中的所有内容 – 这会暂时生成一个非模块化项目。
b.在 build.gradle 中注释掉 eclipse {…} 插件命令 – 这会暂时破坏 eclipse 模块化行为和 jlink 任务。
c.刷新 Gradle。
然后,您可以运行 JUnit 测试,并继续处理您的项目,只要您不需要模块化或 jlink 任务。
恢复镜像构建的模块化和 jlink 任务:
a.取消注释(恢复) module-info.java 文件的内容。
b.取消注释(恢复)build.gradle 中的 eclipse {} 插件命令。
c.刷新 Gradle。
这并不算太痛苦,只要在执行 JUnit 测试时能够在没有模块化的情况下工作即可。不过,请告诉我是否有办法避免所有这些麻烦——也许有 Gradle(或 Eclipse 插件)解决方案?