JavaFX 和 OpenJDK

我正在尝试决定是否可以切换到 JavaFX 用于 Java 应用程序的用户界面。我的大多数用户都在使用 OracleJRE,它已经集成了 JavaFX。但是,有些人正在使用 OpenJDK (在 Linux 上)。这个(旧的)问题表明 OpenJDK 在 JavaFX 上处理得非常糟糕。根据 这个的问题,OpenJFX 的替代版本只能在第9版中完全集成到 OpenJDK 中。所以我的问题有两个:

  • OpenJDK 中对 JavaFX 的支持还是那么糟糕吗?
  • 如果是这样,是否有任何 Linux 发行版已经提供了 OpenJFX 包,这样用户就不必使用 自己建造了?
154589 次浏览

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

JavaFX 是 OpenJDK 的一部分

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

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

现代 JavaFX 发行版是模块

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

具体针对 JavaFX11 + ,详见 https://openjfx.io站点:

JavaFX 运行时可以作为特定于平台的 SDK 使用,也可以作为许多 jmods 使用,或者作为 MavenCentral 中的一组构件使用。

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

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

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

2021年9月更新

另外,请看相关问题:

其中包括有关 Java8和一些更高版本的信息。

2019年12月最新情况

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

JavaFX 的开放原始码储存库在 https://github.com/openjdk/jfx

在链接的源位置,您可以找到 open JavaFX 的许可证文件(目前这个 驾照与 OpenJDK 的许可证匹配: GPL + 类路径异常)。

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

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

为了作为自包含的应用程序发布,Java14计划实现 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 二进制发行版:

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

OpenJDK 和 Oracle JDK 在 JavaFX 方面的差异

为 Java8提供了以下信息。至于 Java9、 VP6编码不适用于 JavaFXOracle WebStart/Browser 嵌入式应用程序部署技术也不受欢迎。因此,JavaFX 的未来版本,即使由 Oracle 发布,也可能不会包含任何非开源的技术。

Oracle JDK 包含了一些 OpenJDK 无法使用的软件:

  • ON2 VP6视频编解码器由谷歌和谷歌共同拥有,尚未开源。
  • Oracle WebStart/Browser 嵌入式应用程序部署技术。

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

其他更常见的视频格式,如 H.264,可以通过开放版本的 JavaFX 进行很好的播放(只要在目标机器上预先安装了适当的编解码器)。

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

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

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

2019年12月更新:

针对 JDK 11 + 的 WebStart 开发了一个开源版本,可以在 https://openwebstart.com上获得。

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

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

2019年12月更新 :

现在 JavaFX 已经从大多数二进制 JDK 和 JRE 发行版(包括 Oracle 的发行版)中分离出来,可以作为一个独立的 SDK、一组 jmods 或者作为从 中央玛文存储库(如 https://openjfx.io所概述的)获得的库依赖项使用,因此不再需要标准的 Linux OpenJDK 发行版包含 JavaFX。

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

关于实质性应用程序部署的建议

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

此部署模式的描述如下:

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

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

由于 Java 的一个版本与您的应用程序绑定在一起,因此您不必关心机器上预先安装了哪个版本的 Java,它具有哪些功能,以及它是否与您的程序兼容。相反,您可以针对确切的 Java 运行时版本测试应用程序,并将其与应用程序一起分发。部署应用程序的用户体验将与在他们的机器上安装本机应用程序(例如窗口)相同。前任或者。安装了 msi,一个 OS X。Dmg Linux.转速或。Deb).

注意: 自包含的应用程序特性仅适用于 Java8和 Java9,而不适用于 Java10-13。Java14通过 JEP 343: 包装工具再次计划从 OpenJDK 发行版提供对该特性的支持。

2018年4月更新: 甲骨文对未来发展的现行政策信息

试试 建筑工厂

有需要修改这些脚本(包含错误,不完全做“事情”要求) ,我将在未来几天上传我的脚本分叉从 obuildFactory。所以我也会相应地更新我的答案。

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

作为一个快速解决方案,您可以复制 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或更高

对我来说,这很管用。

$ sudo apt-get install openjfx

也回答了这个问题:

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

在 Linux 上这并不是一个问题,但在 Windows 上就没那么容易了,特别是如果你想发布 JRE 的话。

你实际上可以在 windows 上使用 OpenJFX 和 OpenJDK8,你只需要自己组装它:

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

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

将所有文件从 OpenFX zip 复制到 JDK 上,瞧,你就有了一个带 JavaFX 的 OpenJDK。

更新 :

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

我需要在 Windows 中运行一个.jar,它需要 JavaFX。我也不需要 JDK 部分。

注意: 我没有麻烦更改 PATH/JAVA_HOME变量,因为在我的示例中不需要它,更完整的演练请参见: 如何在 Windows 上安装 OpenJDK11?

  1. 下载 OpenJDK 和 JavaFX (jmods)(本示例的版本为17.0.2)

Https://jdk.java.net/17/

Https://gluonhq.com/products/javafx/

  1. 将下载的文件解压缩。将. jmod 文件从 Java FX 目录复制/移动到 OpenJDK 目录(jmods 子目录)。

  2. 使用 jlink 创建一个 JRE,使用这个 web 应用程序来获得确切的命令行选项: Https://justinmahar.github.io/easyjre/

PowerShell 代码片段:

$Version = '17.0.2'
$DownDir = 'path\to\dir\with\.zip'
$JdkDir = "jdk-${Version}"
$JavaFxDir = "javafx-jmods-${Version}"
$NewDir = "jre-${Version}+javafx"
$ProgramFilesDir = "$env:ProgramFiles\OpenJDK\${NewDir}"
Set-Location -Path $DownDir


# Unzip archives
Expand-Archive -Path "openjfx-${Version}_windows-x64_bin-jmods.zip" -Destination .
Expand-Archive -Path "openjdk-${Version}_windows-x64_bin.zip" -Destination .


# Create a custom runtime image using jlink, excluding all modules that start with 'jdk.'
Copy-Item -Path "${JavaFxDir}\*.jmod" -Destination "${JdkDir}\jmods"
$Mods = Get-Item -Path "$JdkDir\jmods\*.jmod" | ? { !($_.Name -like 'jdk.*') }
$Mods = $Mods.Name -replace '.jmod$' -join ','
& "${JdkDir}\bin\jlink.exe" --output $NewDir --compress=2 --no-header-files --no-man-pages --module-path "${JdkDir}\jmods" --add-modules $Mods


# (Optional) Delete unzipped directories
Remove-Item -Path $JdkDir,$JavaFxDir -Recurse


# Test if the .jar works
$jar = Get-Item "\path\to\.jar"
& "${NewDir}\bin\javaw.exe" -jar $jar


# (Optional) Copy the new directory to Program Files (requires admin privileges), zip it to distribute to other computers and delete it
Copy-Item -Path $NewDir -Destination $ProgramFilesDir -Recurse
Compress-Archive -Path $NewDir -DestinationPath "openjdk-${Version}_jre+javafx_windows-x64_bin.zip"
Remove-Item -Path $NewDir -Recurse


# (Optional) Create shortcut in Desktop
$Lnk = "$env:USERPROFILE\Desktop\Shortcut.lnk"
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($Lnk)
$Shortcut.TargetPath = "${ProgramFilesDir}\bin\javaw.exe"
$Shortcut.WorkingDirectory = $jar.DirectoryName
$Shortcut.Arguments = '-jar "' + $jar.FullName + '"'
$Shortcut.Save()

我用的是 Amazon Coretto JDK,它有我需要的所有 FX 组件。