【问题标题】:Building a JavaFX application using Gradle使用 Gradle 构建 JavaFX 应用程序
【发布时间】:2015-10-02 06:13:38
【问题描述】:

我正在尝试使用 Gradle 构建一个相对简单的 JavaFX 应用程序。 但是,我不知道该怎么做。

我对 Gradle 比较陌生,对于简单(非 javafx)项目,我已成功使用插件 java 和 application 来构建和打包库和命令行应用程序。

但是,当谈到 JavaFX 时,我完全陷入了困境。我读过this article,它建议使用JavaFX 插件,但是我只能找到这个插件的源代码,但没有关于如何实际获取它并使用它的文档(在文章中他们只是从一个远程 URL,但在我的机器上失败了,说我没有被授权...)

关于如何正确执行此操作的任何线索?

【问题讨论】:

    标签: java gradle javafx


    【解决方案1】:

    Here's an example Gradle JavaFX build 在 GitHub 上。注意according to Bintray,插件的最新版本是8.1.1,所以如果你想要最新的,请将插件URL中的'0.3.0'替换为'8.1.1'。

    需要明确的是,这是分发 Gradle 插件的一种非常不寻常的方式。大多数都更容易合并到构建中!

    编辑:使用“应用插件”https://github.com/FibreFoX/javafx-gradle-plugin

    工作的最新分支

    【讨论】:

    • 我的问题正是:apply from: "dl.bintray.com/content/shemnon/javafx-gradle/0.3.0/…" 命令不起作用,bintray 返回错误 401(未经授权)。无论如何,我通过从源代码手动编译插件并在本地包含它来解决
    • 你确定吗?该链接(减去尾随双引号)不需要我进行身份验证。但是,原始文章中使用的确实需要身份验证。
    • 你确实是对的。我搞砸了并复制了一个额外的尾随报价。可以,谢谢。
    • 使用 javafx-gradle-plugin 仍然不允许我从 Idea 运行 JavaFX 应用程序。我想使用这个插件的建议是没有意义的,没有提到应该配置什么才能让应用程序真正运行。
    • 更新到之前的评论。对于所有不知道如何使用 gradle javafx-gradle-plugin 从 idea 运行 JavaFX 应用程序的可怜人来说,我发现你可以这样做:在右侧窗格中打开 Gradle 侧栏 > 任务 > javafx > jfxRun。我还必须复制这个示例项目的结构(是的,结果证明目录结构真的很重要):github.com/gerardoprada/javafx-gradle-hello-world
    【解决方案2】:

    Here is my example project with OpenJDK 12, JavaFX 12 and Gradle 5.4。它使用 JavaFX Gradle 插件。

    • 打开标题为“Hello World!”的 JavaFX 窗口
    • 能够构建工作的可运行分发 zip 文件(Windows 待测试)
    • 无需额外配置即可在 IntelliJ 中打开和运行
    • 能够从命令行运行

    我希望有人发现 Github 项目有用。随意克隆 它。它是通过 Unlicense 获得许可的。

    【讨论】:

      【解决方案3】:

      Peter Ledbrook 的解决方案有效,但以防万一有人想要一个不依赖外部 bintray 链接的解决方案,我在等待答案时找到了一个:

      1) 从源代码构建JavaFX 插件
      2) 放到项目的libs目录下
      3)像这样应用它:

      buildscript {
          repositories {
              flatDir dirs: "../libs"
          }
          dependencies {
              classpath "org.bitbucket.shemnon.javafxplugin:gradle-javafx-plugin:0.5.0-SNAPSHOT"
              classpath files("${System.properties['java.home']}/../lib/ant-javafx.jar")
          }
      }
      
      if (!project.plugins.findPlugin(org.bitbucket.shemnon.javafxplugin.JavaFXPlugin)) {
          project.apply(plugin: org.bitbucket.shemnon.javafxplugin.JavaFXPlugin)
      }
      

      请注意,由于插件本身存在错误,因此需要在类路径中包含 ant-javafx(如果我理解正确的话)

      【讨论】:

        【解决方案4】:

        javafx 的官方 gradle 插件位于https://github.com/openjfx/javafx-gradle-plugin。

        我已经成功地使用了来自 INtelliJ IDEA CE 的这个插件,并用以下内容来说明我的 build.gradle 文件:

        plugins {
            id 'java'
            id 'application'
            id 'maven'
            id 'maven-publish'
            id 'org.openjfx.javafxplugin' version '0.0.8'
        }
        
        javafx {
            // Points to JDK and its JavaFX libraries, also declares target runtime JDK
        //    javaRuntime = '/Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk'
        
            version = '13' // Specify javafx sdk version
            modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.swing', 'javafx.media', 'javafx.graphics']
            sdk = System.getenv('JAVAFX_HOME')
            if (sdk == null || sdk.isBlank()) {
                throw new InvalidUserDataException("JAVAFX_HOME environment variable is not set. It must be set to root folder where JAVAFX SDK is located")
            }
            application {
                def javafxHome = System.getenv('JAVAFX_HOME')
                mainClassName = 'com.foo.FooApp'
                applicationName = 'foo-app'
                applicationDefaultJvmArgs = [
                    "--module-path=${javafxHome}" + File.separator + 'lib',
                    '--add-modules=javafx.controls,javafx.swing,javafx.media,javafx.graphics']
                println("applicationDefaultJvmArgs:" + applicationDefaultJvmArgs)
            }
        }
        
        dependencies {
          ... ommitted ...
        }
        

        【讨论】:

        • application插件与javafxplugin插件无关,因此DSL调用应该在项目根目录(不在javafx内部)。
        【解决方案5】:

        我会使用 gradle init 命令作为:

        thufir@dur:~/NetBeansProjects$ 
        thufir@dur:~/NetBeansProjects$ git clone git@github.com:THUFIR/javaFX.git
        Cloning into 'javaFX'...
        remote: Enumerating objects: 4, done.
        remote: Counting objects: 100% (4/4), done.
        remote: Compressing objects: 100% (3/3), done.
        remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
        Receiving objects: 100% (4/4), 12.48 KiB | 2.08 MiB/s, done.
        thufir@dur:~/NetBeansProjects$ 
        thufir@dur:~/NetBeansProjects$ cd javaFX/
        thufir@dur:~/NetBeansProjects/javaFX$ 
        thufir@dur:~/NetBeansProjects/javaFX$ tree
        .
        ├── LICENSE
        └── README.md
        
        0 directories, 2 files
        thufir@dur:~/NetBeansProjects/javaFX$ 
        thufir@dur:~/NetBeansProjects/javaFX$ gradle init --type java-application --test-framework testng --dsl kotlin
        
        Project name (default: javaFX): 
        
        Source package (default: javaFX): net.bounceme.dur.javafx
        
        BUILD SUCCESSFUL in 17s
        2 actionable tasks: 2 executed
        thufir@dur:~/NetBeansProjects/javaFX$ 
        thufir@dur:~/NetBeansProjects/javaFX$ tree
        .
        ├── build.gradle.kts
        ├── gradle
        │   └── wrapper
        │       ├── gradle-wrapper.jar
        │       └── gradle-wrapper.properties
        ├── gradlew
        ├── gradlew.bat
        ├── LICENSE
        ├── README.md
        ├── settings.gradle.kts
        └── src
            ├── main
            │   ├── java
            │   │   └── net
            │   │       └── bounceme
            │   │           └── dur
            │   │               └── javafx
            │   │                   └── App.java
            │   └── resources
            └── test
                ├── java
                │   └── net
                │       └── bounceme
                │           └── dur
                │               └── javafx
                │                   └── AppTest.java
                └── resources
        
        17 directories, 10 files
        thufir@dur:~/NetBeansProjects/javaFX$ 
        

        这里我首先从 github 克隆了一个空的存储库(许可证和自述文件除外),然后使用 gradle 进行初始化。请注意,它的类型为java-application,并且使用kotlin 作为dsl;这些可以省略或更改为,例如,--type java-library。

        【讨论】:

          猜你喜欢
          • 2015-11-12
          • 1970-01-01
          • 1970-01-01
          • 2017-08-10
          • 2015-06-17
          • 2020-08-18
          • 1970-01-01
          • 2019-04-26
          相关资源
          最近更新 更多