什么是 JavaFX 运行时?
Posted
技术标签:
【中文标题】什么是 JavaFX 运行时?【英文标题】:What is the JavaFX runtime? 【发布时间】:2017-10-19 10:44:32 【问题描述】:在文档中经常说“JavaFX 运行时”在后台执行 XY - 但什么是“运行时”? 如果我理解正确(请编辑),运行时由以下部分组成:
JavaFX 框架的所有类等,位于 javafx 包中并存储在 jxfrt.jar 文件中 “JavaFX-Launcher”线程 “JavaFX 应用程序线程”:运行 JavaFX 应用程序的所有对象和线程。它们是在调用 Appplication.launch() 方法时由 JavaFX-Launcher 线程创建的。我的问题是: 运行时是什么?
【问题讨论】:
您的三个要点加上恰当命名的 Java 运行时环境 (JRE)。 【参考方案1】:所指的 JavaFX 运行时是您提到的 jfxrt.jar
jar。它包含 JavaFX 所需的库,包括 JavaFX launcher 线程(包 com.sun.javafx.application 中的 LauncherImpl)和 Application 类。 jfxrt.jar
的位置(无论你有JDK还是JRE)是:
我没有看到 Oracle 的 javadoc 中记录的 LauncherImpl,因此链接到上面的 OpenJDK 版本。
【讨论】:
运行时还包括一些本地库(例如,Windows 上的.dll
,Linux 上的.so
等),用于与系统操作系统和图形系统交互。【参考方案2】:
J Woodchucks 答案针对 Java 7 和 8。此答案仅针对 Java 9+。
对于 JRE 9+,jfxrt.jar
不存在,并被 <JRE_HOME>/jmods
目录中的 .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 或切换到包含 JavaFX 的 Java 运行时(例如 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 打包器可以进一步将自定义运行时打包为self-contained application 安装包的一部分(如果需要)。自包含应用程序包含您的 Java 或 JavaFX 应用程序以及运行该应用程序所需的 JRE。
一旦 Java 9 正式发布,我相信 Oracle 将提供一些进一步的官方文档和示例,演示如何为 JavaFX 应用程序创建自定义模块化运行时并将其用作自包含应用程序的一部分。
此外,gluon 等第三方供应商还提供工具,用于在各种设备(如 iPad 和 android 手机)上使用自定义 JavaFX 运行时打包应用程序。
【讨论】:
【参考方案3】: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 项目的详细信息可以在 here 找到。您必须下载并提取(最近的)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
... 看起来很复杂,但实际上很简单:您使用当前目录和库中的所有 .jar 配置类路径...但您还必须指定这是一个模块路径,然后说您需要哪些模块。注意 Windows 将需要另一个斜杠,并且类路径中的元素用“;”分隔当然,而不是“:”。
【讨论】:
以上是关于什么是 JavaFX 运行时?的主要内容,如果未能解决你的问题,请参考以下文章
错误:缺少 JavaFX 运行时组件,需要在 Eclipse 中运行此应用程序
错误:缺少 JavaFX 运行时组件 - JavaFX 11 和 OpenJDK 11 以及 Eclipse IDE
如何在 Java 11 中将 JavaFX 运行时添加到 Eclipse?