JavaFX和OpenJDK


109

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

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

您的应用程序的执行模式是什么(如何部署?)
jewelsea

@jewelsea它作为独立程序运行。
mdriesen 2013年

@docM为ubuntu机器切换到oracle-(sun)-jdk是一种解决方案吗?webupd8.org/2012/01/...
nyyrikki

@nyyrikki这是一个选择。但是如果JavaFX和OpenJDK不混在一起,我宁愿坚持使用Java Swing。
mdriesen

2
@Yngve当Ubuntu和Debian开始包括软件包时,我将所有内容都移植到了JavaFX。
mdriesen

Answers:


99

JavaFX是OpenJDK的一部分

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

更新2019年12月

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

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

在链接的源位置,您可以找到用于打开JavaFX的许可证文件(当前,此许可证与OpenJDK的许可证匹配:GPL + classpath异常)。

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

如果您想快速开始使用开放JavaFX,请 Belsoft Liberica JDK发行版提供了OpenJDK的预构建二进制文件(当前),该二进制文件包括针对各种平台的开放JavaFX。

为了作为独立的应用程序进行分发,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)。

关于JavaFX,Open JDK和Oracle JDK之间的区别

为Java 8提供了以下信息。从Java 9开始,JavaFX不推荐使用VP6编码甲骨文Webstart的/浏览器嵌入应用程序部署技术也已过时。因此,即使JavaFX的未来版本由Oracle分发,也可能不会包含任何非开源技术。

Oracle JDK包括一些无法从OpenJDK使用的软件。与JavaFX相关的主要组件有两个。

  1. Google拥有的ON2 VP6视频编解码器尚未公开。
  2. Oracle WebStart / Browser嵌入式应用程序部署技术。

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

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

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

如果OpenSource社区开发了一种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在2014年3月发布时Java 8 Linux软件包不包含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。计划通过JEP 343:打包工具 Java 14 再次从OpenJDK发行版提供对此功能的支持。

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


@Emmanuel,感谢您在此方面的工作。JavaFX是JDK的一部分,因此(至少在JDK模块化之前),我不确定为什么会有一个单独的OpenJFX包,而不是在标准OpenJDK包中包括所有必需的运行时文件(如Oracle JDK发行版)。在开放式JFX的邮件列表,如果需要进一步的讨论将是一个好地方。
jewelsea

如果有人对JDK感兴趣,而对JavaFX不感兴趣,则单独的软件包可以提供一定程度的灵活性。毕竟,模块化不是Java 9的目标吗?:)
Emmanuel Bourg 2014年

11
“目前还没有完成,但是如果Java 8在2014年3月发布时Java 8 Linux软件包不包含JavaFX,我会感到非常惊讶”。您一定会感到惊讶,因为OpenJDK 8不包含OpenJFX。

2
Arch Linux也有针对
openjfx的

2
@NoBugs这可能有点太晚了,不能有用,但是Ubuntu 14.04不包含OpenJDK 8,这就是为什么找不到对应的JFX软件包的原因。我不记得是哪个Ubuntu版本引入它的,但它肯定在Ubuntu 16.04中可用-连同“ openjfx”包一起提供。
Mike Allen

50

对我来说,这很有效。

$ sudo apt-get install openjfx

3
可能是将JavaFX添加到Linux JDK的最简单方法
Reimeus

尽管对于许多人来说这是正确的答案,但某些操作系统不提供此软件包。对于那些不webupd8 PPA适合Ubuntu的用户和fedyFedora桌面安装程序的用户,有两种快速的方法来设置包含JavaFX的最新Oracle JDK / JRE。
tresf

3
对于Ubuntu 18.04,它仍然依赖Java 8,但是默认的是Java10。如果安装它,最终将得到2个Java。
jgomo3 '18

根据如何与openjdk-11一起安装openjfx?,对于Java版本11+,要使用JavaFX,而不是apt-get install openjfx(目前仅适用于Java 8),可以使用openjfx.io网站上的说明,其中JavaFX“可以作为特定于平台的SDK使用, jmods,以及在maven Central中的一组工件。”
jewelsea

已经在tracker.debian.org/pkg/openjfx上为OpenJDK-11发布了一个Debian openjfx软件包,所以也许是这种方法。sudo apt-get install openjfx,将继续受到支持,并适用于更高版本的JavaFX和ubuntu。请注意,Debian openjfx软件包的更新频率似乎不如openjfx.io分发的库那样频繁,因此,如果您希望使用最新版本,则最好使用openjfx.io发行版。
jewelsea

11

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


我找不到在Ubuntu 18.04中安装openjfx的位置,但是我从硬盘中安装的另一个程序中偷走了这些jar和其他文件(您可以检查phpstorm或clion :)),它像一个魅力一样工作。谢谢
Heichou

我将文件从JDK1.8.0_251(Oracle Java 1.8)复制到java-8-openjdk-amd64(ubuntu存储库OpenJDK 8)。仍然无法使用JavaFX运行jar文件。但是,当我在Eclipse构建路径中将jfxrt.jar链接为外部库jar时,程序确实在Eclipse上下文中运行。运行“ apt-cache policy libgtk2.0-0”给出“已安装:2.24.32-1ubuntu1”
Phil Freihofner,

7

还回答这个问题:

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

在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


谢谢。我检查了AdoptOpenJDK github站点,但显示“旧版存储库”。您是否知道在哪里可以找到与新的仓库github.com/AdoptOpenJDK/openjdk8-binaries/releases的版本相匹配的较新的OpenJFX-binary ?
豪特曼

3

尝试obuildfactory

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

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


1
不幸的是,OpenJFX没有Windows对应版本
madduci

0

据Oracle称,OpenJDK和javaFX的集成将于2014年第一季度发布(请参阅路线图:http : //www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html)。因此,对于第一个问题,答案是您必须等到那时。对于第二个问题,别无选择。因此,现在使用Java swing或启动javaFX并等待


您答案中的链接已断开。我来到类似页面的关闭页面是oracle.com/us/corporate/press/1854982
ILMostro_7 2014年

@ ILMostro_7您评论中的链接已断开
Blake

已经够老了 我相信他们会随着新计划的形成而改变他们的网站。
ILMostro_19年

以下站点指示javafx将是从java-11开始的独立库。 oracle.com/technetwork/java/java-se-support-roadmap.html
ILMostro_7 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.