gradle - 从 Gradle 项目运行可执行文件时在 JavaFX 中捆绑?

标签 gradle javafx groovy java-11

在过去的几天里,我一直在努力寻找 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/

相关文章:

Android 在 docker 容器中构建

java - 我想在执行点击事件时获取GridPane的索引

java - 在 JavaFX WebEngine 上设置代理?

grails - 用于Grails的JasperReports插件:获取 “No such report spec”异常

excel - 使用groovy grails上载和读取excel文件并将数据插入数据库

java - 来自模块的 Gradle 传递依赖

android - Gradle错误无法解决:com.github.Binary-Finery:Bungee:master-SNAPSHOT

android - 具有依赖项的Android Studio自定义gradle任务- “Could not get unknown property”

JavaFX 自定义 TableCell 监听

grails - Grails-无法创建类[QuartzGrailsPlugin]的新实例!