JavaFX 和 OpenJDK

2022-08-31 08:28:08

我正在尝试决定是否可以为Java应用程序的用户界面切换到JavaFX。我的大多数用户都会使用Oracle JRE,它现在已经集成了JavaFX。但是,有些人正在使用OpenJDK(在linux上)。这个(旧的)问题表明OpenJDK与JavaFX打交道非常糟糕。根据这个问题,替代的OpenJFX将仅在版本9中完全集成到OpenJDK中。所以我的问题是双重的:

  • OpenJDK中的JavaFX支持仍然那么糟糕吗?
  • 如果是这样,是否有任何Linux发行版已经提供了OpenJFX软件包,因此用户不必自己构建它

答案 1

JavaFX是OpenJDK的一部分

JavaFX项目本身是开源的,是OpenJDK项目的一部分

然而,OpenJDK项目包括许多项目,包括孵化项目和其他项目,如OpenJFX,其源代码和实现不是作为某些JDK / JRE发行版的一部分发布的(例如Oracle JDK 11 +实现和许多开源JDK Linux软件包安装不包括JavaFX运行时)。

现代JavaFX发行版是模块

JavaFX不是大多数JDK 11 +下载的一部分,它通常由开发人员作为模块或单独的SDK下载。

专门针对 JavaFX 11+,详见 https://openjfx.io 站点:

JavaFX 运行时可作为特定于平台的 SDK,或作为多个 jmods,或作为 Maven Central 中的一组工件提供。

这意味着 JavaFX 可以从在受支持的平台上运行的任何现代 JDK 中使用,方法是在运行时模块路径上包含相应的 JavaFX 模块(可从 openjfx 或 Maven Central 获得)。

openjfx 提供的所有 JavaFX 模块都是不包含闭源代码的开源实现。

对于基于 JavaFX 的应用程序分发给最终用户,建议基于 JDK 和 JavaFX 模块 + 所需的依赖库代码和应用程序代码打包运行时映像分发。关于这个打包的完整讨论超出了这个答案的范围,但是如果需要,可以创建一个完全基于开源JDK + JavaFX + library+应用程序代码的发行版。有关此内容的更多(尽管不全面)信息,请参阅有关运行时映像的 openjfx.io 文档

2021年9月更新

另请参阅相关问题:

其中涵盖了有关Java 8以及一些更高版本的信息。

2019年12月更新

有关如何使用开源 JavaFX 的最新信息,请访问 https://openjfx.io。这包括有关将 JavaFX 用作从现有 JDK 访问的模块化库(例如开放式 JDK 安装)的说明。

JavaFX的开源代码存储库处于 https://github.com/openjdk/jfx

在链接的源位置,您可以找到开放 JavaFX 的许可证文件(目前此许可证与 OpenJDK 的许可证匹配:GPL+类路径例外)。

该项目的维基位于:https://wiki.openjdk.java.net/display/OpenJFX/Main

如果你想快速开始使用开放的JavaFX,Bellsoft的Liberica JDK发行版提供了预构建的OpenJDK二进制文件,其中包括适用于各种平台的OpenJFX。

对于作为独立应用程序分发,Java 14 计划实现 JEP 343:打包工具,该工具“支持本机打包格式,为最终用户提供自然的安装体验。这些格式包括Windows上的msi和exe,macOS上的pkg和dmg,以及Linux上的deb和rpm“,用于部署基于OpenJFX的应用程序,具有本机安装程序,并且没有额外的平台依赖项(例如预安装的JDK)。


较旧的信息可能会随着时间的推移而过时

从 OpenJDK 存储库构建 JavaFX

您可以完全从源代码构建OpenJDK(包括JavaFX)的开放版本,该版本不依赖于Oracle JDK或封闭源代码。

更新:使用从 OpenJDK 源代码预构建的 JavaFX 发行版

正如在对这个问题的评论和另一个答案中所指出的,Debian Linux发行版提供了基于OpenJDK的JavaFX二进制发行版:

(据我所知,目前这仅适用于Java 8)。

Open JDK 和 Oracle JDK 在 JavaFX 方面的区别

为 Java 8 提供了以下信息。从Java 9开始,JavaFX的VP6编码已被弃用Oracle WebStart/Browser嵌入式应用程序部署技术也被弃用。因此,JavaFX的未来版本,即使它们由Oracle分发,也可能不包括任何非开源技术。

Oracle JDK包含一些无法从OpenJDK中使用的软件。与 JavaFX 相关的组件:

  • 谷歌拥有的ON2 VP6视频编解码器尚未开源。
  • Oracle WebStart/Browser 嵌入式应用部署技术。

这意味着JavaFX的开放版本无法播放VP6 FLV文件。这不是一个很大的损失,因为很难找到VP6编码器或VP6编码的媒体。

其他更常见的视频格式,如H.264,使用开放版本的JavaFX可以正常播放(只要您在目标计算机上预安装了适当的编解码器)。

缺乏WebStart/Browser Embedded部署技术实际上与OpenJDK本身有关,而不是与JavaFX有关。此技术可用于部署非 JavaFX 应用程序。

如果开源社区为Java(和其他软件)开发一种部署技术,完全取代WebStart和浏览器嵌入式部署方法,为应用程序分发提供良好的轻量级,低影响的用户体验,那就太好了。我相信已经有一些项目开始服务于这样的目标,但它们还没有达到很高的成熟度和采用水平。

就个人而言,我觉得WebStart/Browser嵌入式部署是传统技术,目前有更好的方法来部署许多JavaFX应用程序(例如自包含应用程序)。

2019年12月更新:

WebStart for JDK 11+的开源版本已经开发出来,https://openwebstart.com。

谁需要创建包含 JavaFX 的 Linux OpenJDK 发行版

由那些为基于OpenJDK的Linux发行版创建软件包的人(例如Redhat,Ubuntu等)为JDK和JRE创建包含JavaFX的RPM。然后,这些软件分发者需要将生成的软件包放在其标准分发代码存储库中(例如 fedora/red hat network yum 存储库)。目前还没有这样做,但是如果Java 8 Linux软件包在2014年3月Java 8发布时不包括JavaFX,我会感到非常惊讶。

更新,2019年12月

现在,JavaFX已经从大多数二进制JDK和JRE发行版(包括Oracle的发行版)中分离出来,取而代之的是,它可以作为独立的SDK,jmods集或作为从中央Maven存储库获得的库依赖项(如 https://openjfx.io 所述),那么标准Linux OpenJDK发行版就不需要包含JavaFX了。

如果你想要一个包含JavaFX的预构建的JDK,请考虑Liberica JDK发行版,它为各种平台提供。

关于部署大量应用程序的建议

我建议使用Java的独立应用程序部署模式。

此部署模式的说明如下:

应用程序安装在本地驱动器上,并使用 Java 和 JavaFX 运行时的私有副本作为独立程序运行。该应用程序的启动方式与该操作系统的其他本机应用程序相同,例如,使用桌面快捷方式或菜单项。

您可以从Oracle JDK发行版或包含JavaFX的OpenJDK构建中构建自包含的应用程序。目前,使用Oracle JDK更容易做到这一点。

由于 Java 的某个版本与您的应用程序捆绑在一起,因此您不必关心计算机上可能预安装了哪个版本的 Java、它具有哪些功能以及它是否与您的程序兼容。相反,您可以针对确切的 Java 运行时版本测试应用程序,并将其与应用程序一起分发。部署应用程序的用户体验将与在其计算机上安装本机应用程序相同(例如,安装了.exe或.msi,OS X .dmg,linux .rpm或.deb)。

注意:自包含应用程序功能仅适用于 Java 8 和 9,而不适用于 Java 10-13。Java 14,通过JEP 343:打包工具,计划再次从OpenJDK发行版中为此功能提供支持。

2018 年 4 月更新:有关 Oracle 当前未来发展政策的信息


答案 2

对我来说,这有效。

$ sudo apt-get install openjfx

推荐