代码之家  ›  专栏  ›  技术社区  ›  mike rodent

从Gradle项目运行可执行文件时,在JavaFX中绑定?

  •  0
  • mike rodent  · 技术社区  · 6 年前

    其中一个问题是groovy2(甚至groovy3)还不能处理java9+模块 one clever solution 出去。

    但是我成功地完成了一个Gradle项目,它不仅成功地完成了几乎所有的事情,包括“run”任务(来自“application”插件),还使用TestFX运行测试!这实际上是在使用Java11、Groovy2.5.9、JavaFX13等。

    它甚至会执行任务“installdist”(当包含在构建.gradle). 这将生成一个可执行文件,其中的“lib”目录中充满了独立运行所需的所有jar(如task“assemble”,只是没有压缩)。

    问题是,当我执行那个可执行文件时,我得到的是经典的

    我想我已经用尽了我所能做的来配置Gradle的常规方法:考虑到我使用Groovy开发应用程序和测试代码,我认为不可能将Gradle项目配置为让“installdist”生成一个支持JavaFX的可执行文件。但是。。。有什么我能做的吗 之后 产生了这个,就像我可以运行的某个命令,它会以某种方式引入JavaFX文件并将它们链接进来?即使这涉及到不优雅地链接到一些javafxjar文件或位置?

    ...
    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\u HOME原来是[project directory]/build。但是在这个目录下没有“lib”目录。有一个目录“libs”,它正好包含一个文件:GradleExp-1.0.jar,27kb,不是想象中的“胖”jar。

    我刚刚将“installdist”任务中的“lib”目录复制到/build,并运行了那个脚本文件:尽管现在所有的javafxjar都可用,我还是得到了 错误:缺少JavaFX运行时组件,运行此应用程序需要这些组件

    0 回复  |  直到 6 年前
        1
  •  2
  •   mike rodent    6 年前

    如果您希望类路径上的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()
        }
    
    }
    
    推荐文章