使用Gradle构建JavaFX应用程序

41

我正在尝试使用Gradle构建相对简单的JavaFX应用程序,但是我不知道如何做。

我对Gradle相对陌生,并且对于简单的(非JavaFX)项目,我成功地使用了插件javaapplication来构建和打包库和命令行应用程序。

然而,在处理JavaFX时,我完全陷入了困境。我阅读了这篇文章,其中建议使用JavaFX插件,但是我只找到了此插件的源代码,没有关于如何获取它并使用它的文档(在文章中,他们仅从远程URL应用它,但是在我的机器上失败了,显示我未经授权...)

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

5个回答

20

在GitHub上,这里有一个关于Gradle JavaFX构建的示例(点击此处)。请注意,根据Bintray的说法,插件的最新版本是8.1.1,如果您想要获得最新版本,请将插件URL中的“0.3.0”替换为“8.1.1”。

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

编辑:使用“apply plugin”可以工作的最新分支https://github.com/FibreFoX/javafx-gradle-plugin


我的问题就是:从“http://dl.bintray.com/content/shemnon/javafx-gradle/0.3.0/javafx.plugin” 应用命令不起作用,bintray 返回错误401(未经授权)。无论如何,我通过手动编译插件并在本地包含它来解决了问题。 - Master_T
1
你确定吗?对我来说,那个链接(去掉尾随的双引号)不需要身份验证。然而,在原始文章中使用的那个链接确实需要身份验证。 - Peter Ledbrook
您说得没错。我犯了一个错误,复制了一个额外的尾引号。现在它可以工作了,谢谢。 - Master_T
1
使用javafx-gradle-plugin仍然无法让我从Idea运行JavaFX应用程序。我猜想,如果没有提到还需要配置什么才能使应用程序实际运行,建议使用此插件就毫无意义了。 - AbstractVoid
更新之前的评论。对于所有不知道如何使用gradle javafx-gradle-plugin从idea运行JavaFX应用程序的可怜灵魂,我发现你可以通过以下方式实现:在右侧窗格上打开Gradle侧边栏>任务>javafx>jfxRun。我还必须复制此示例项目的结构(是的,原来目录结构真的很重要):https://github.com/gerardoprada/javafx-gradle-hello-world - AbstractVoid
值得一提的是,该插件的作者已经在2018年4月宣布将停止维护目前版本(他不再继续更新),并且正在私下开发新版,但暂时没有明确的发布日期。更多详情请参考 https://github.com/FibreFoX/javafx-gradle-plugin/issues/119。 - Some Guy

7

这是一个使用OpenJDK 12、JavaFX 12和Gradle 5.4的示例项目,它使用了JavaFX Gradle插件。

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

希望有人会发现这个Github项目很有用。欢迎克隆它。它使用Unlicense许可证。


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”内部)。 - Hendra Anggrian
我的 build.gradle 文件不喜欢这里给出的语法。例如,它更喜欢 id("org.openjfx.javafxplugin") version "0.0.8"。那是否意味着相同的事情?如果是,那么这个答案中还需要改变什么才能使它工作? - gotube

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。

1
我会使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接