JavaFX 和 OpenJDK

新手上路,请多包涵

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

  • OpenJDK 对 JavaFX 的支持还这么差吗?
  • 如果是这样,是否有任何 Linux 发行版已经提供了 OpenJFX 包,这样用户就不必 自己构建它了

原文由 mdriesen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

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、多个 jmod 或 Maven Central 中的一组工件提供。

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

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

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

2021 年 9 月更新

另外,请参阅相关问题:

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

2019 年 12 月更新

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

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

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

该项目的 wiki 位于: 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

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

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

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

   sudo apt-get install openjfx

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

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

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

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

  • ON2 VP6 视频编解码器归谷歌所有,谷歌尚未开源。
  • Oracle WebStart/Browser Embedded 应用程序部署技术。

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

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

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

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

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

2019 年 12 月更新:

已开发出适用于 JDK 11+ 的 WebStart 开源版本,可在 https://openwebstart.com 获得。

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

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

_2019 年 12 月更新_:

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

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

部署大量应用程序的建议

我建议使用 Java 的 自包含应用程序 部署模式。

这种部署模式的描述是:

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

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

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

注意: 自包含应用程序功能仅适用于 Java 8 和 9,不适用于 Java 10-13。 Java 14 通过 JEP 343: Packaging Tool 计划再次从 OpenJDK 发行版中提供对这一功能的支持。

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

原文由 jewelsea 发布,翻译遵循 CC BY-SA 4.0 许可协议

对我来说这很有效。

 $ sudo apt-get install openjfx

原文由 Vineel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题