128

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

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

6 回答 6

119

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 二进制发行版:

(据我所知,目前这只适用于 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 当前未来发展政策的信息

于 2013-10-22T22:56:10.617 回答
51

对我来说,这很有效。

$ sudo apt-get install openjfx
于 2016-03-12T10:44:47.463 回答
12

作为一种快速的解决方案,您可以复制 JavaFX 运行时 JAR 文件以及从Oracle JRE(JDK)或任何使用 JavaFX 的自包含应用程序(例如JavaFX Scene Builder 2.0)引用的文件:

cp <JRE_WITH_JAVAFX_HOME>/lib/ext/jfxrt.jar     <JRE_HOME>/lib/ext/
cp <JRE_WITH_JAVAFX_HOME>/lib/javafx.properties <JRE_HOME>/lib/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libprism_*  <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libglass.so <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libjavafx_* <JRE_HOME>/lib/amd64/

只需确保您拥有 gtk 2.18 或更高版本

于 2015-01-10T00:01:52.807 回答
7

同时回答这个问题:

我在哪里可以获得 OpenJDK (Windows) 的预构建 JavaFX 库

在 Linux 上它不是一个真正的问题,但在 Windows 上它不是那么容易,特别是如果你想分发 JRE。

您实际上可以在 Windows 上将 OpenJFX 与 OpenJDK 8 一起使用,您只需自己组装它:

从这里下载 OpenJDK:https ://github.com/AdoptOpenJDK/openjdk8-releases/releases/tag/jdk8u172-b11

从这里下载 OpenJFX:https ://github.com/SkyLandTW/OpenJFX-binary-windows/releases/tag/v8u172-b11

从 JDK 顶部的 OpenFX zip 中复制所有文件,瞧,你有一个带有 JavaFX 的 OpenJDK。

更新

幸运的是,Azul 现在有一个 OpenJDK+OpenJFX 构建,可以在他们的社区页面下载:https ://www.azul.com/downloads/zulu-community/?&version=java-8-lts&os=windows&package=jdk-fx

于 2018-11-08T10:36:28.000 回答
3

尝试obuildfactory

需要修改这些脚本(包含错误并且不完全执行所需的“事情”),我将在接下来的几天上传从 obuildfactory 分叉的我的脚本。所以我也会相应地更新我的答案。

在那之前享受吧,先生:)

于 2015-01-06T10:47:46.157 回答
0

根据 Oracle 将在 2014 年第一季度集成 OpenJDK 和 javaFX(参见路线图:http ://www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html )。所以,对于第一个问题,答案是你必须等到那时。对于第二个问题,没有其他办法。因此,现在使用 java swing 或启动 javaFX 并等待

于 2013-10-22T21:07:24.380 回答