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

Gradle构建的JavaFX项目无法在Windows中运行,java,gradle,javafx,groovy,cross-platform,Java,Gradle,Javafx,Groovy,Cross Platform,我有一个JavaFX Gradle项目,当我在Linux(Mint 18.3)中执行installDist任务(应用程序Gradle插件的一部分)时,它运行正常 这将生成一个自包含的应用程序,该应用程序由一个Linux可执行脚本文件、一个Windows.bat文件和一个库组成,其中包含运行该应用程序所需的所有.jar,包括一个包含您自己的代码和资源的.jar。它们放在“bin”目录的同级目录中,称为“lib” 在Linux上运行该可执行文件效果良好 但后来我启动到W10并尝试运行.bat文件。我

我有一个JavaFX Gradle项目,当我在Linux(Mint 18.3)中执行
installDist
任务(应用程序
Gradle插件的一部分)时,它运行正常

这将生成一个自包含的应用程序,该应用程序由一个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)]
我的项目有几个方面可能会使事情复杂化

  • 它使用Java11(和JavaFX11)。这意味着JavaFX不再与其余部分捆绑在一起。两个操作系统都运行Java11
  • 它是用Groovy编写的:也就是说,应用程序代码,所有的应用程序代码,都是用Groovy编写的,而不是Java
  • 因为它是用Groovy编写的,所以要使
    installDist
    任务正常工作是相当困难的,即使在Linux中也是如此。最后,我不得不创建一个“launcher”类,然后调用
    应用程序
    子类(这里是
    HelloFx
    ),并让它运行
    start

    Application.launch(HelloFx,args)
    -全部血淋淋的细节

  • 我知道build.gradle文件中有一些小问题,当你想让一个可执行文件在这两个不同的操作系统中运行时,特别是要确保文件路径正确,以及路径分隔符,即Linux的“/”,W10的“\”。但我以前在非JavaFX项目中成功地做到了这一点,而且我似乎已经在这里配置了一些东西

    或许浏览一下Gradle在Linux中生成的.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文件显然包含在类路径中。JavaFX模块的设置,因为它是在build.gradle中配置的,大概是在我的代码所在的.jar文件中进行的。。。不知何故?

    可从

    在第6.2节中,it规定

    每个目标平台的软件包 自包含的应用程序包是特定于平台的,只能为构建的同一系统生成。如果你想在Windows、Linux和Mac上提供自包含的应用程序包,你必须在这三种平台上构建你的项目

    从.bat摘录中可以看出,JavaFX模块是特定于平台的,表示“linux”

    我个人从未利用gradle构建过多个平台,但我相信这里有一些答案,我很快找到了这个答案


    如果没有在Windows native或通过VM进行构建,您可能会提出一个新问题并发布build.gradle文件,社区可以帮助您解决这个问题

    ,为什么不使用JDK 14的新jpackage工具构建一个合适的安装程序?@mipa从未听说过,将查找它。谢谢。谢谢你的澄清。是的,你所说的Linux.jars太明显了,我很尴尬。我只需要克隆/拉取W10中的回购协议并在那里构建。我被一个事实误导了,那就是我用非FX项目管理多平台构建。没什么好尴尬的,我数不清自己花了多少时间试图强制一个符合我希望/预期工作流行为的解决方案!它知道什么时候退一步,(谢天谢地)利用这个社区回到正轨。如果您有时间深入了解我在答案中的第二个链接,并按照链接的问题进行操作,我相信您可以从您的linux设备中构建一个可工作的gradle版本,以满足多部署自包含应用程序的需要,如果您值得花时间这样做的话。