什么是 JavaFX 运行时?
What is the JavaFX runtime?
在文档中经常说 'the JavaFX runtime' 在后台做 XY - 但什么是 "the runtime"?
如果我理解正确(请编辑)运行时由以下部分组成:
- 所有 类 JavaFX 框架等,位于包 javafx 中并存储在 jxfrt.jar 文件中
- 'JavaFX-Launcher' 线程
- 'JavaFX Appliaction Thread':所有对象和线程运行 您的 JavaFX 应用程序。它们是在调用 Appplication.launch() 方法时由 JavaFX-Launcher 线程创建的。
我的问题是: 运行时是什么?
所指的 JavaFX 运行时是您提到的 jfxrt.jar
jar。它包含 JavaFX 所需的库,包括 JavaFX launcher thread (LauncherImpl in package com.sun.javafx.application) and Application class。 jfxrt.jar
的位置(无论您有 JDK 还是 JRE)是:
- 对于Java7,在jre\lib
下
- 对于Java8,在jre\lib\ext
下
我没有在 Oracle 的 javadoc 中看到 LauncherImpl 的文档,因此链接到上面的 OpenJDK 版本。
回答地址 Java 7 和 8。这个回答只是地址 Java 9+。
对于 JRE 9+,jfxrt.jar
不存在并被 <JRE_HOME>/jmods
目录中的 .jmods
替换。这是作为 JDK modularization 的一部分完成的。 JavaFX 所需的其他本机库包含在 <JRE_HOME>/lib
目录中。 Java如果没有所需的本机库,FX 将无法运行。
您可以使用供应商(例如 Oracle)(可能还有第三方 OpenJDK 提供商,例如 Ubuntu 或 Redhat JRE 包)提供的完整 JRE 运行时间。这将包括 运行 JavaFX 所需的所有模块和库,以及一些构成 JRE 的一部分但不一定是 运行 JavaFX 应用程序所必需的模块和库。
请注意,对于 Java 8,一些 OpenJDK 供应商选择不将 JavaFX 运行time 作为其 Java 发行版的一部分,需要 [= =17=] OpenJDK 的自定义构建或切换到 java 运行time,其中确实包含 JavaFX(例如 Oracle JRE)。希望对于 Java 9,所有 OpenJDK 供应商都将提供包含 JavaFX 的完整 JRE 运行 次,但您可能需要等到 OpenJDK 供应商发布普遍可用的 Java 9 运行 次才知道。
可以使用 Java9 为 JavaFX 创建自定义模块化 运行time,从而消除您的应用程序可能不需要的一些 JRE 模块。 JavaFX 的自定义模块化 运行time 需要 javafx.*
modules that you wish to use, any dependent modules of those modules and any necessary native libraries. You can package your JavaFX application with a custom runtime using the JavaFX packager. The packaging technique of the JDK 9 javafxpackager is based upon the Java 9 module system; the internal implementation of which uses the java linker。
java 打包器可以进一步打包自定义 运行time 作为 self-contained application 安装包的一部分(如果需要)。独立应用程序包含您的 Java 或 JavaFX 应用程序以及 运行 应用程序所需的 JRE。
一旦 Java 9 全面发布,我相信 Oracle 将提供一些进一步的官方文档和示例,演示如何为 [=38] 创建自定义模块化 运行time =]FX 应用程序并将其用作独立应用程序的一部分。
此外,gluon 等第三方供应商提供工具,用于在 iPad 和 Android 手机等各种设备上使用自定义 JavaFX 运行 次打包应用程序。
jewelsea 对 Java 9+ 的更新再次更改为 Java 11.
Java 11 未与 JavaFX 捆绑在一起:您必须自己获取并 link。
如果您使用 Gradle,您实际上可以在不知道所有细节的情况下执行此操作。 build.gradle 文件通常包含这些行:
plugins {
...
id 'org.openjfx.javafxplugin' version '0.0.8'
}
...
javafx {
version = "13"
modules = [ 'javafx.controls', 'javafx.fxml' ... ]
}
...
在 IDE 类似 IntelliJ 中配置非 Gradle JavaFX 项目的详细信息可以在 here 中找到。您必须下载并提取(最近的)JavaFX JDK,然后将其作为库包含,然后作为模块包含。
如果您需要在 CLI 中 运行(或只是为了查看发生了什么),请执行此类操作。假设您已经从 here 中提取了一个 JavaFX JDK 11 到一个目录(由您创建),例如 ~/.java/JavaFX。假设你在包 sample
中有一个 class,称为 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
...看起来很复杂其实很简单:你配置class路径为当前目录和库中的所有.jars...但你也必须指定这是一个模块路径,然后说出你需要哪些模块。注意 Windows 需要另一个斜杠,class 路径中的元素用“;”分隔当然不是“:”。
在文档中经常说 'the JavaFX runtime' 在后台做 XY - 但什么是 "the runtime"? 如果我理解正确(请编辑)运行时由以下部分组成:
- 所有 类 JavaFX 框架等,位于包 javafx 中并存储在 jxfrt.jar 文件中
- 'JavaFX-Launcher' 线程
- 'JavaFX Appliaction Thread':所有对象和线程运行 您的 JavaFX 应用程序。它们是在调用 Appplication.launch() 方法时由 JavaFX-Launcher 线程创建的。
我的问题是: 运行时是什么?
所指的 JavaFX 运行时是您提到的 jfxrt.jar
jar。它包含 JavaFX 所需的库,包括 JavaFX launcher thread (LauncherImpl in package com.sun.javafx.application) and Application class。 jfxrt.jar
的位置(无论您有 JDK 还是 JRE)是:
- 对于Java7,在jre\lib 下
- 对于Java8,在jre\lib\ext 下
我没有在 Oracle 的 javadoc 中看到 LauncherImpl 的文档,因此链接到上面的 OpenJDK 版本。
对于 JRE 9+,jfxrt.jar
不存在并被 <JRE_HOME>/jmods
目录中的 .jmods
替换。这是作为 JDK modularization 的一部分完成的。 JavaFX 所需的其他本机库包含在 <JRE_HOME>/lib
目录中。 Java如果没有所需的本机库,FX 将无法运行。
您可以使用供应商(例如 Oracle)(可能还有第三方 OpenJDK 提供商,例如 Ubuntu 或 Redhat JRE 包)提供的完整 JRE 运行时间。这将包括 运行 JavaFX 所需的所有模块和库,以及一些构成 JRE 的一部分但不一定是 运行 JavaFX 应用程序所必需的模块和库。
请注意,对于 Java 8,一些 OpenJDK 供应商选择不将 JavaFX 运行time 作为其 Java 发行版的一部分,需要 [= =17=] OpenJDK 的自定义构建或切换到 java 运行time,其中确实包含 JavaFX(例如 Oracle JRE)。希望对于 Java 9,所有 OpenJDK 供应商都将提供包含 JavaFX 的完整 JRE 运行 次,但您可能需要等到 OpenJDK 供应商发布普遍可用的 Java 9 运行 次才知道。
可以使用 Java9 为 JavaFX 创建自定义模块化 运行time,从而消除您的应用程序可能不需要的一些 JRE 模块。 JavaFX 的自定义模块化 运行time 需要 javafx.*
modules that you wish to use, any dependent modules of those modules and any necessary native libraries. You can package your JavaFX application with a custom runtime using the JavaFX packager. The packaging technique of the JDK 9 javafxpackager is based upon the Java 9 module system; the internal implementation of which uses the java linker。
java 打包器可以进一步打包自定义 运行time 作为 self-contained application 安装包的一部分(如果需要)。独立应用程序包含您的 Java 或 JavaFX 应用程序以及 运行 应用程序所需的 JRE。
一旦 Java 9 全面发布,我相信 Oracle 将提供一些进一步的官方文档和示例,演示如何为 [=38] 创建自定义模块化 运行time =]FX 应用程序并将其用作独立应用程序的一部分。
此外,gluon 等第三方供应商提供工具,用于在 iPad 和 Android 手机等各种设备上使用自定义 JavaFX 运行 次打包应用程序。
jewelsea 对 Java 9+ 的更新再次更改为 Java 11.
Java 11 未与 JavaFX 捆绑在一起:您必须自己获取并 link。
如果您使用 Gradle,您实际上可以在不知道所有细节的情况下执行此操作。 build.gradle 文件通常包含这些行:
plugins {
...
id 'org.openjfx.javafxplugin' version '0.0.8'
}
...
javafx {
version = "13"
modules = [ 'javafx.controls', 'javafx.fxml' ... ]
}
...
在 IDE 类似 IntelliJ 中配置非 Gradle JavaFX 项目的详细信息可以在 here 中找到。您必须下载并提取(最近的)JavaFX JDK,然后将其作为库包含,然后作为模块包含。
如果您需要在 CLI 中 运行(或只是为了查看发生了什么),请执行此类操作。假设您已经从 here 中提取了一个 JavaFX JDK 11 到一个目录(由您创建),例如 ~/.java/JavaFX。假设你在包 sample
中有一个 class,称为 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
...看起来很复杂其实很简单:你配置class路径为当前目录和库中的所有.jars...但你也必须指定这是一个模块路径,然后说出你需要哪些模块。注意 Windows 需要另一个斜杠,class 路径中的元素用“;”分隔当然不是“:”。