什么是JavaFX运行时?

时间:2017-05-19 10:31:41

标签: java javafx runtime

在文档中经常会说JavaFX运行时'是在后台做XY - 但是"运行时"? 如果我理解正确(请编辑),运行时由以下部分组成:

  • JavaFX框架的所有类等,位于包javafx中并存储在jxfrt.jar文件中
  • JavaFX-Launcher'螺纹
  • JavaFX Appliaction Thread'所有运行JavaFX应用程序的对象和线程。它们是在调用Appplication.launch()方法时由JavaFX-Launcher线程创建的。

我的问题是:什么是 运行时?

3 个答案:

答案 0 :(得分:3)

J Woodchucks回答了Java 7和8.这个答案只涉及Java 9 +。

对于JRE 9+,jfxrt.jar不存在,并被.jmods目录中的<JRE_HOME>/jmods替换。这是JDK modularization的一部分。 JavaFX的其他必需本机库包含在<JRE_HOME>/lib目录中。没有所需的本机库,JavaFX将无法工作。

您可以使用Oracle等供应商提供的完整JRE运行时(可能还有第三方OpenJDK提供程序,如Ubuntu或Redhat JRE程序包)。这将包括运行JavaFX所需的所有模块和库,以及构成JRE一部分但不一定需要运行JavaFX应用程序的一些模块和库。

注意,对于Java 8,一些OpenJDK供应商选择不将JavaFX运行时作为其Java发行版的一部分包含在内,需要install of an additional package自定义构建OpenJDK或切换到包含Java运行时的Java运行时JavaFX(例如Oracle JRE)。希望对于Java 9,所有OpenJDK供应商都将提供包含JavaFX的完整JRE运行时,但您可能需要等到OpenJDK供应商发布通常可用的Java 9运行时才能找到。

可以使用Java 9为JavaFX创建自定义模块化运行时,从而消除了应用程序可能不需要的一些JRE模块。 JavaFX的自定义模块化运行时需要您要使用的javafx.*模块,这些模块的任何相关模块以及任何必需的本机库。您可以使用JavaFX packager将JavaFX应用程序打包为自定义运行时。 JDK 9 javafxpackager的打包技术基于Java 9模块系统;其内部实现使用java linker

java packager可以进一步将自定义运行时打包为self-contained application安装包的一部分(如果需要)。自包含的应用程序包含Java或JavaFX应用程序以及运行应用程序所需的JRE。

一旦Java 9发布其一般可用性版本,我相信Oracle将提供一些进一步的官方文档和示例,演示如何为JavaFX应用程序创建自定义模块化运行时,并将其用作自包含应用程序的一部分。

此外,第三方供应商(如gluon)提供了在各种设备(如iPad和Android手机)上使用自定义JavaFX运行时打包应用程序的工具。

答案 1 :(得分:2)

引用的JavaFX Runtime是你提到的jfxrt.jar jar。它包含JavaFX所需的库,包括JavaFX launcher线程(包含com.sun.javafx.application中的LauncherImpl)和Application类。 jfxrt.jar的位置(无论您是JDK还是JRE)是:

我没有看到Oracle的javadoc中记录的LauncherImpl,因此链接到上面的OpenJDK版本。

答案 2 :(得分:0)

jewelsea对Java 9+的更新再次通过 Java 11 进行了更改。

Java 11没有与JavaFX捆绑在一起:您必须自己获取并链接它。

实际上,如果您使用Gradle,就可以在不知道所有细节的情况下执行此操作。 build.gradle文件通常包含以下行:

plugins {
    ...
    id 'org.openjfx.javafxplugin' version '0.0.8'
}
...
javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.fxml' ... ]
}
...

可以在here中找到有关在像IntelliJ这样的IDE中配置非Gradle JavaFX项目的详细信息。您必须下载并解压缩一个(最新的)JavaFX JDK,然后将其作为一个库,然后作为一个模块。

如果您需要在CLI上运行(或仅查看正在发生的情况),请执行此类操作。假设您已将JavaFX JDK 11从here提取到一个目录(由您创建),例如〜/ .java / JavaFX。并假设您在包sample中有一个名为Main的类,其中该类extends javafx.application.Application

java -cp .:~/.java/JavaFX/javafx-sdk-11.0.2/lib/*.jar --module-path ~/.java/JavaFX/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml sample.Main

...看起来很复杂,但实际上却很简单:您可以使用当前目录和库中的所有.jars配置类路径,但是还必须指定这是模块路径,然后说您需要哪些模块。注意Windows将需要另一个斜杠,并且类路径中的元素用“;”分隔。而不是“:”。