在过去的几天里,我一直在努力寻找 chalice :Gradle + Java 11 + JavaFX + 用 Groovy 而不是 Java 编写我所有的应用程序和测试代码。
几个问题之一是 Groovy 2(甚至是 Groovy 3)还不能处理 Java 9+ 模块,它规定了 one clever solution出去。
但是我已经设法一起完成了一个 Gradle 项目,它不仅几乎成功地完成了所有工作,包括“运行”任务(来自“应用程序”插件),还使用 TestFX 运行测试!这确实是在使用 Java 11、Groovy 2.5.9、JavaFX 13 等。
它甚至会执行任务“installdist”(当包含在 build.gradle 中时)。这会生成一个可执行文件,其中包含一个“lib”目录,其中包含您需要独立运行的所有 jar(如任务“assemble”,只是未压缩)。
问题是,当我执行该可执行文件时,我得到了经典的“错误:JavaFX 运行时组件丢失,并且需要运行此应用程序”。仍然很困惑为什么会发生这种情况,因为目录 [project dir]/build/install/GradleExp/lib 确实包含不少于 7 个 JavaFX .jar。
我想我已经用尽了尝试常规配置 Gradle 的能力:鉴于我正在使用 Groovy 进行应用程序和测试代码,我认为不可能将 Gradle 项目配置为让“installdist”生成一个现成的-运行启用 JavaFX 的可执行文件。但是……有什么我可以做的之后 已经产生了这个,就像我可以运行的一些命令会以某种方式引入 JavaFX 文件并将它们链接起来?即使这涉及不雅地链接到某些 JavaFX jar 文件或位置?
或者,也许我可以使用 .../build/scripts 下的“build”任务生成的可执行 sh 脚本文件?在定义 CLASSPATH 时,这会在开始时包含上述 7 个 JavaFX .jar 文件:
...
CLASSPATH=$APP_HOME/lib/GradleExp-1.0.jar:
$APP_HOME/lib/commons-math3-3.6.1.jar:
$APP_HOME/lib/guava-27.0.1-jre.jar:
$APP_HOME/lib/javafx-fxml-13-linux.jar:
$APP_HOME/lib/javafx-controls-13-linux.jar:
$APP_HOME/lib/javafx-controls-13.jar:
$APP_HOME/lib/javafx-graphics-13-linux.jar:
$APP_HOME/lib/javafx-graphics-13.jar:
$APP_HOME/lib/javafx-base-13-linux.jar:
$APP_HOME/lib/javafx-base-13.jar:...
...当我尝试运行该脚本时,我得到:
mike@M17A /.../GradleExp/build/scripts $ ./GradleExp
Error: Could not find or load main class SceneSwitcher
Caused by: java.lang.ClassNotFoundException: SceneSwitcher
编辑
这是一件有趣的事情:事实上,该脚本文件中的 APP_HOME 原来是 [项目目录]/build。但在那之下没有目录“lib”。有一个目录“libs”,其中恰好包含一个文件:GradleExp-1.0.jar,27 kB,无论如何都不是“胖”jar。
我刚刚将“lib”目录从“installdist”任务复制到/build,然后运行该脚本文件:再次,尽管所有这些 JavaFX jar 现在都可用,但我再次收到“错误:JavaFX 运行时组件丢失,并且是需要运行此应用程序”。嗯...我有很多东西要学。
最佳答案
Slaw 和 cfrick 在他们的评论中给出了我的问题的答案。我认为这可能对某些人有用。
如果你想要类路径上的 JavaFX 模块,那么创建一个不扩展的单独的主类 Application
并调用 Application.launch(YourApp.class, args)
来自 main
方法。
cfrick 的示例精简工作 Gradle 项目是 here .我添加了以下行:
installDist{}
...这使得一个新任务可用:
./gradlew installdist
然后将在 build/install/下生成一个可执行文件。如果 cfrick 的 github 页面消失了,build.gradle 是这样的:
plugins {
id 'groovy'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
repositories {
jcenter()
}
javafx {
version = "11.0.2"
modules = [ 'javafx.controls' ]
}
dependencies {
implementation 'org.codehaus.groovy:groovy:3.+'
}
application {
mainClassName = 'ofx.App'
}
installDist{} // my addition
和 src/main/groovy/ofx/App.groovy 是这样的:
package ofx
import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.control.Label
import javafx.scene.layout.StackPane
import javafx.stage.Stage
class App {
static void main(String[] args) {
Application.launch(HelloFx, args)
}
}
class HelloFx extends Application {
@Override
void start(Stage stage) {
def javaVersion = System.getProperty("java.version")
def javafxVersion = System.getProperty("javafx.version")
Label l = new Label("Hello, JavaFX $javafxVersion, running on Java $javaVersion.")
Scene scene = new Scene(new StackPane(l), 640, 480)
stage.setScene(scene)
stage.show()
}
}
关于gradle - 从 Gradle 项目运行可执行文件时在 JavaFX 中捆绑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60591754/