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

问题描述 投票:0回答:1

我有一个JavaFX的Gradle项目,当我做一个项目时,它运行正常。installDist 任务 application Gradle插件)的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$2(LauncherImpl.java:195)]

我的项目有几个方面可能会让事情变得复杂化:

  1. 它使用Java11(和JavaFX11)。这意味着,JavaFX不再与其他部分捆绑在一起。两个操作系统都在运行Java11。
  2. 它是用Groovy编写的:也就是说,应用程序代码,所有的应用程序代码,都是用Groovy编写的,而不是Java。
  3. 因为它是用Groovy编写的,所以要想获得相当棘手的。installDist 任务正常工作,即使在Linux下也是如此。最后,我不得不创建一个 "启动器 "类,然后由它来调用 Application 子类 HelloFx)并让它运行 start:

    Application.launch(HelloFx, args) - 血淋淋的细节 此处.

我知道,当你想让一个可执行文件在这两种不同的操作系统上运行时,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文件肯定是被包含在classpath中的。JavaFX模块的设置,因为是在build.gradle中配置的,大概是发生在我的代码的.jar文件中......以某种方式?

java gradle javafx groovy cross-platform
1个回答
1
投票

从文档中可以看到 https:/docs.oracle.comjavafx2deploymentself-contained-packaging.htm。

在第6.2节中,它规定:

每个目标平台的包 自带的应用程序包是特定于平台的,只能为您构建的同一系统生产。如果您想在Windows、Linux和Mac上交付自足的应用程序包,您必须在这三个平台上构建您的项目。

从您的.bat摘录中可以看到,JavaFX模块是特定于平台的,表示 "linux"。

我个人从来没有利用gradle搭建过多个平台,但相信这里有一些答案,谁都有,看看这个我很快就找到了。https:/stackoverflow.coma537600183625077。

在Windows原生或通过虚拟机进行构建,你可以打开一个新的问题,并发布你的build.gradle文件,社区可以帮助你解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.