使用 Gradle 构建 JavaFX 应用程序
Posted
技术标签:
【中文标题】使用 Gradle 构建 JavaFX 应用程序【英文标题】:Building a JavaFX application using Gradle 【发布时间】:2015-10-02 06:13:38 【问题描述】:我正在尝试使用 Gradle 构建一个相对简单的 JavaFX 应用程序。 但是,我不知道该怎么做。
我对 Gradle 比较陌生,对于简单(非 javafx)项目,我已成功使用插件 java
和 application
来构建和打包库和命令行应用程序。
但是,当谈到 JavaFX 时,我完全陷入了困境。我读过this article,它建议使用JavaFX
插件,但是我只能找到这个插件的源代码,但没有关于如何实际获取它并使用它的文档(在文章中他们只是从一个远程 URL,但在我的机器上失败了,说我没有被授权...)
关于如何正确执行此操作的任何线索?
【问题讨论】:
【参考方案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 Led*** 的解决方案有效,但以防万一有人想要一个不依赖外部 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
。
【讨论】:
以上是关于使用 Gradle 构建 JavaFX 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
无法在 intellij idea 中使用 gradle 构建 javafx 项目
IntelliJ + Gradle + JavaFX 构建,但未运行
使用 gradle 和 intellij 为 JavaFX 构建 FatJar,得到 NoClassDefFOundError