我正在尝试决定是否可以切换到 JavaFX 用于 Java 应用程序的用户界面。我的大多数用户都在使用 OracleJRE,它已经集成了 JavaFX。但是,有些人正在使用 OpenJDK (在 Linux 上)。这个(旧的)问题表明 OpenJDK 在 JavaFX 上处理得非常糟糕。根据 这个的问题,OpenJFX 的替代版本只能在第9版中完全集成到 OpenJDK 中。所以我的问题有两个:
根据 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 二进制发行版:
Https://packages.qa.debian.org/o/openjfx.html
安装:
sudo apt-get install openjfx
(据我所知,目前这只适用于 Java8)。
OpenJDK 和 Oracle JDK 在 JavaFX 方面的差异
为 Java8提供了以下信息。至于 Java9、 VP6编码不适用于 JavaFX和 Oracle WebStart/Browser 嵌入式应用程序部署技术也不受欢迎。因此,JavaFX 的未来版本,即使由 Oracle 发布,也可能不会包含任何非开源的技术。
Oracle JDK 包含了一些 OpenJDK 无法使用的软件:
这意味着 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?
PATH
JAVA_HOME
Https://jdk.java.net/17/
Https://gluonhq.com/products/javafx/
将下载的文件解压缩。将. jmod 文件从 Java FX 目录复制/移动到 OpenJDK 目录(jmods 子目录)。
使用 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 组件。