使用 JDK 11+ 运行 JavaFX 应用程序

Posted

技术标签:

【中文标题】使用 JDK 11+ 运行 JavaFX 应用程序【英文标题】:Running JavaFX application with JDK 11+ 【发布时间】:2018-11-22 13:09:40 【问题描述】:

如果我了解 Oracle 的声明,JavaFX 将不会包含在从 JDK 11 开始的 JDK 中,并且只能作为 OpenJFX 提供。

作为软件开发人员,我必须采取哪些步骤才能让我的 JavaFX 应用程序在 JDK 11+ 上运行?有什么好的建议吗?是否可以通过 Gradle 使用 OpenJDK?

【问题讨论】:

安装openjfx即可。 在这种情况下“安装”是什么意思?我是否还需要将 OpenJFX 与我的应用程序一起发布? 是的,必须的。就像您依赖 JRE 一样。您是手动安装 JRE(和 OJFX)还是自定义 JRE(使用 jlink 构建)由您自己判断。 到目前为止,我只需要告诉用户安装 JDK 或 JRE。此外,Java 通常已经安装在几乎所有的机器上。那么现在当我想从 JDK 11 开始使用 JavaFX 时,我需要用户进行另一个困难的平台相关安装吗?这是一个倒退。本机库可以更智能地以独立于平台的方式打包。参见例如OSHI 项目。对甲骨文的一些批评是有道理的。 @StefanReich 我不同意。 Jigsaw 允许您将 JRE 与您的应用程序捆绑在一起,它可以在尚未安装 JRE 的系统上运行。 【参考方案1】:

JavaFX 11 可从 Maven Central 获得,因此您可以使用 Maven 将其作为任何其他常规依赖项包含在您的项目中:

<dependencies>
    <dependency>
        <groupId>javafx</groupId>
        <artifactId>javafx.controls</artifactId>
        <version>11.0.0</version>
    </dependency>
</dependencies>

或 Gradle:

dependencies 
    compile 'javafx:javafx.controls:11.0.0'

到目前为止(2018 年 6 月),这是在 progress 中工作的,但它应该在 JDK 11 release 时准备就绪。

现在,您可以从 here 下载 JavaFX 独立 SDK 的早期版本,正如 recently (May 2018) 宣布的那样。

请注意,在任何情况下,您都不需要构建 OpenJDK 或 OpenJFX。

您会发现一堆包含 javafx.base.jarjavafx.controls.jar 等不同模块的 jar,以及您平台所需的本机库。

您可以使用可从here 获得的 OpenJDK 10 或 11 EA 构建来测试它们。

示例

如果您有 JavaFX 应用程序类:

public class JavaFX11 extends Application 

    @Override
    public void start(Stage stage) throws Exception 
        Scene scene = new Scene(new StackPane(new Label("JavaFX 11")), 300, 200);
        stage.setScene(scene);
        stage.show();
    

你可以编译它:

<path.to>/jdk-11.jdk/Contents/Home/bin/javac --module-path <path.to>/javafx-sdk-11/lib/ --add-modules=javafx.controls -d class/ src/<package.name>/JavaFX11.java

并运行它:

cd class
<path.to>/jdk-11.jdk/Contents/Home/bin/java --module-path <path.to>/javafx-sdk-11/lib/ --add-modules=javafx.controls <package.name>.JavaFX11

【讨论】:

非常感谢您的回答。继续使用 JavaFX 令人放心!二进制文件将根据什么许可证分发? 如果您检查二进制文件,每个模块都有许可证文件。到目前为止,它似乎是带有类路径异常的 GNU 通用公共许可证第 2 版。 我们是否必须始终使用&lt;path.to&gt;/jdk-11.jdk/Contents/Home/bin/java --module-path &lt;path.to&gt;/javafx-sdk-11/lib/ --add-modules=javafx.controls &lt;package.name&gt;.JavaFX11 运行应用程序? 查看getting started guide,这取决于您使用的构建工具。【参考方案2】:

OpenJFX 与您的应用程序捆绑在一起

Answer by José Pereda 关于在您的应用中捆绑 JavaFX 库是正确的。

OpenJFX 与 Java 捆绑

另一种方法是让您的用户在他们的机器上安装 Java 实现,其中包括 OpenJFX (JavaFX) 库。对于广泛分发给公众的应用程序,这种方法可能不可行。但对于企业或机构等受控环境中的应用,这可能是有益的。

OpenJXF 是一个sub-project on the OpenJDK project。但JavaFX 技术并未定义为Java SE 的一部分。因此,一些供应商选择将 OpenJFX 与其基于 OpenJDK 的产品捆绑在一起,而另一些则没有。

目前至少有两家供应商发布了包含 OpenJFX 的 Java SE 实现。两者都建立在OpenJDK 之上。两者都将 OpenJFX 反向移植到 Java 8。

Azul Systems 的 ZuluFX。见their FAQ。 LibericaFX 由 BellSoft。见their configurations page的中间部分。

这是我为帮助选择 Java 实现的供应商而制作的流程图。注意底部的 OpenJFX bundled? 分支。

【讨论】:

【参考方案3】:

您可以使用 LibericaJDK 代替 OpenJDK。它与 JavaFX 捆绑在一起,可以为您节省大量配置。 https://bell-sw.com/pages/downloads/#/java-11-lts 只需要下载“Full JDK”即可。

【讨论】:

以上是关于使用 JDK 11+ 运行 JavaFX 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在模块路径上使用 OpenJFX 11 JMODS 在 JDK 11 上运行 javafx 示例

试图在intellij jre11上运行javafx程序[重复]

迁移到 JDK 11 + JavaFX 11 给出 RuntimeException

JavaFX 11:创建标签时出现 IllegalAccessError

JavaFX 11:创建标签时出现 IllegalAccessError

找不到javafx.controls JavaFX 11 / JDK 11.0.1 [重复]