Gradle-构建的 JavaFX 项目无法在 Windows 中 运行

Gradle-built JavaFX project fails to run in Windows

我有一个 JavaFX Gradle 项目,当我执行 installDist 任务时 运行 没问题(application [=56 的一部分=] 插件) 在 Linux (Mint 18.3).

这会生成一个独立的应用程序,其中包含一个 Linux 可执行脚本文件、一个 Windows .bat 文件和一个包含您需要的所有 .jar 的库,其中包括一个包含 .jar 的文件您自己的代码和资源,运行 应用程序。这些都放在 "bin" 目录的兄弟目录中,称为 "lib".

运行 该可执行文件在 Linux.

上运行良好

但随后我启动​​进入 W10 并尝试 运行 .bat 文件。我收到以下错误:

Discovered throwable java.lang.RuntimeException: No toolkit found message No toolkit found

Root cause throwable java.lang.RuntimeException: No toolkit found message No toolkit found

Root cause trace:
[com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:272)
 com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
 com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
 com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
 com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:195)]

我的项目有几个方面可能会使事情复杂化

  1. 它使用 Java11(和 JavaFX11)。这意味着 JavaFX 不再与其他产品捆绑在一起。两个操作系统都是 运行ning Java 11.
  2. 写在Groovy中:即app代码,所有的app代码,都在Groovy,而不是Java。
  3. 因为它是用 Groovy 编写的,所以要使 installDist 任务正常运行非常棘手,即使在 Linux 中也是如此。最终我不得不创建一个 "launcher" class,然后调用 Application subclass(此处为 HelloFx)并将其获取到 运行 start

    Application.launch(HelloFx, args) - 血淋淋的详细信息 .

我知道当您希望可执行文件在这 2 个不同的操作系统中 运行 可用时,build.gradle 文件中存在一些小问题,特别是正确设置文件路径和路径分隔符,即 Linux 的“/”,W10 的“\”。但我以前在非 JavaFX 项目中设法做到了这一点,而且我似乎已经在此处进行了配置。

也许浏览 Linux 中 Gradle 生成的 .bat 文件可能会有所帮助:

...
set CLASSPATH=%APP_HOME%\lib\Organiser-1.0.7-SNAPSHOT.jar;%APP_HOME%\lib\javafx-fxml-11.0.2-linux.jar;%APP_HOME%\lib\javafx-controls-11.0.2-linux.jar;%APP_HOME%\lib\javafx-controls-11.0.2.jar;%APP_HOME%\lib\javafx-graphics-11.0.2-linux.jar;%APP_HOME%\lib\javafx-graphics-11.0.2.jar;%APP_HOME%\lib\javafx-base-11.0.2-linux.jar;%APP_HOME%\lib\javafx-base-11.0.2.jar;%APP_HOME%\lib\groovy-2.5.11.jar;%APP_HOME%\lib\logback-classic-1.2.3.jar;%APP_HOME%\lib\logback-core-1.2.3.jar;%APP_HOME%\lib\slf4j-api-1.7.25.jar

@rem Execute Organiser
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %ORGANISER_OPTS%  -classpath "%CLASSPATH%" core.Launcher %CMD_LINE_ARGS%
...

从上面可以看出 JavaFX 文件确实包含在 class 路径中。 JavaFX 模块的设置,因为它是在 build.gradle 中配置的,大概是在我的代码的 .jar 文件中发生的......不知何故?

来自 https://docs.oracle.com/javafx/2/deployment/self-contained-packaging.htm

上的文档

在第 6.2 节中指出

Package per target platform Self-contained application packages are platform specific and can only be produced for the same system that you build on. If you want to deliver self-contained application packages on Windows, Linux and Mac you will have to build your project on all three platforms.

正如您从 .bat 摘录中看到的那样,JavaFX 模块是特定于平台的,表明 'linux'

我从来没有亲自利用 gradle 构建多个平台,但我相信这里有一些答案谁有,检查这个我很快找到的

缺少 Windows 本机或通过 VM 构建,您可以打开一个新问题,post 您的 build.gradle 文件和社区可以帮助您解决这个问题