JavaFX运行时是什么?

3
在文档中经常提到“JavaFX运行时”在后台执行XY操作,但是“运行时”是什么呢? 如果我理解正确(请编辑),则运行时由以下几部分组成:
- JavaFX框架的所有类等,位于javafx包中,存储在jxfrt.jar文件中 - “JavaFX-Launcher”线程 - “JavaFX应用程序线程”:运行您的JavaFX应用程序的所有对象和线程。当调用Application.launch()方法时,它们由JavaFX-Launcher线程创建。
我的问题是:什么是运行时?

您的三个要点加上恰当命名的Java运行时环境(JRE)。 - Elliott Frisch
3个回答

4

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

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

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

请注意,对于Java 8,一些OpenJDK供应商选择不将JavaFX运行时作为其Java发行版的一部分包含在内,需要安装额外软件包、定制构建OpenJDK或切换到包括JavaFX的java运行时(例如Oracle JRE)。希望对于Java 9,所有OpenJDK供应商都将提供包含JavaFX的完整JRE运行时,但您可能需要等待OpenJDK供应商发布普遍可用的Java 9运行时才能找到。
使用Java 9可以创建自定义的模块化JavaFX运行时,消除应用程序可能不需要的一些JRE模块。自定义的JavaFX模块化运行时需要您希望使用的javafx.*模块、这些模块的任何依赖模块以及任何必要的本地库。您可以使用JavaFX打包工具将您的JavaFX应用程序与自定义运行时打包在一起。JDK 9 javafxpackager的打包技术基于Java 9模块系统;其内部实现使用java链接器
Java打包工具可以进一步将自定义运行时作为独立应用程序安装包的一部分进行打包(如果需要)。独立应用程序包含您的Java或JavaFX应用程序以及运行该应用程序所需的JRE。
一旦Java 9完成了其正式发布,我相信Oracle会提供一些官方文档和示例,演示如何为JavaFX应用程序创建自定义模块化运行时,并将其作为自包含应用程序的一部分使用。
此外,第三方供应商,例如gluon,提供工具来在各种设备上打包应用程序与自定义JavaFX运行时。

2
所指的JavaFX Runtime是您提到的jfxrt.jar文件。它包含了JavaFX所需的库,包括JavaFX启动线程(LauncherImpl在com.sun.javafx.application包中)和Application类。不管您是否安装了JDK或JRE,jfxrt.jar的位置如下:
  • 对于Java 7,在jre\lib下
  • 对于Java 8,在jre\lib\ext下
我没有在Oracle的javadoc文档中看到LauncherImpl的说明,因此链接到了OpenJDK版本。

运行时还包括一些本地库(例如在Windows上是.dll,在Linux上是.so等),用于与系统操作系统和图形系统进行接口。 - jewelsea

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' ... ]
}
...

在像IntelliJ这样的IDE中配置非Gradle JavaFX项目的详细信息可以在这里找到。您需要下载并提取(最新的)JavaFX JDK,然后将其作为库包含,再作为模块。

如果您需要在CLI上运行(或只是查看发生了什么),请执行此类操作。假设您已经从这里提取了JavaFX JDK 11到一个目录(由您创建)中,例如~/.java/JavaFX。并且假设您有一个名为Main的包中类sample,它extendsjavafx.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将需要另一个斜杠,并且类路径中的元素用";"而不是":"分隔。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接