gpt4 book ai didi

java - 如何创建自定义 JVM 启动器?

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:03 27 4
gpt4 key购买 nike

历史上一直存在“如何在没有主方法的情况下启动应用程序”问题,大多数问题的表述都是“你不能”。我注意到现在只需扩展 Application 即可启动 JavaFX 应用程序。我一直在使用类似于 Application.launch() 的方法,但在这种情况下我总是将 main 方法视为样板代码。于是我又开始寻找答案。

我找到了this answer将我们链接到可以了解如何创建自己的 JVM 启动器的地方,但遗憾的是该文章已不再存在。我花了很长时间寻找任何可能暗示我应该做什么的东西,但没有结果。

我的问题

如何创建自定义 JVM 启动器来启动基于正在扩展的应用程序?例如,假设一个项目有 1 个声明的类:

class MyApplcation extends App {

}

启动项目不需要 main 方法,因为它扩展了 App。这不是问题,尽管这是我的目标。问题是如何创建自定义 JVM 启动器?

我的猜测是,这将涉及使用某种基础,为我们提供某种骨架,但我不确定在哪里可以找到这样的东西。

最佳答案

JavaFX 如何实现其应用程序执行模型

由于 JEP 153: Enhance the java command-line launcher to launch JavaFX applications 的实现,可以启动不包含 main 方法的 JavaFX 应用程序。

这是对 openjdk 启动器逻辑的修改,以检查要启动的类是否扩展了 Application,如果是,则调用 JavaFX 特定启动器,该启动器启动 Java 运行时和关联线程,创建 GUI 窗口(JavaFX 术语为 Stage),然后创建 avaFX 应用程序的实例,并根据 JavaFX application lifecycle rules 调用应用程序上的 init 和 start 方法。

通过代码跟踪实现:

  1. main.c JVM 调用 java.c 中的 JLILaunch
  2. java.c looks 用于 Java 类 sun.launcher.LauncherHelpercalls into the java class using JNI ,调用 checkAndLoadMain 函数。
  3. 如果要启动的类没有 main 方法,但有 extend the JavaFX application class ,则会创建一个 FXHelper 类来保存启动参数。
  4. 对 FXHelper 的引用通过 JNI 返回到 java.c。
  5. java.c invokes 通过 JNI 的 main method on the FXHelper
  6. FXHelper uses reflection 用于调用 com.sun.javafx.application.LauncherImpl.launchApplication()
  7. JavaFX LauncherImpl 将设置应用程序类加载器,然后是应用程序主类上的第一个 try to invoke a main() 方法。
  8. 如果没有 main() 方法,JavaFX LauncherImpl 将为 start up the JavaFX launcher thread
  9. 在启动器线程上,LauncherImpl 将为 call init() on the JavaFX application
  10. 在 JavaFX 应用程序线程上,LauncherImpl 将为 create a new Stage (window)pass it to the start method of the application
  11. 当最后一个阶段关闭或退出JavaFX平台时,LauncherImpl返回the stop method on the application is called
  12. 所有调用跟踪都会返回,并且应用程序会退出,因为没有其他事情可做。

如何自定义启动器

  1. 获取 sun.launcher.LauncherHelper 代码的副本。
  2. 忽略代码顶部的警告“这不是 Sun Microsystems 支持的任何 API 的一部分。如果您编写依赖于此的代码,您需要自行承担风险。此代码及其内部接口(interface)可能会更改或删除,恕不另行通知。”并开始修改代码。
  3. 创建您自己的 FXHelper 版本,它将调用您自己的 LauncherImpl 而不是 JavaFX(如果目标主应用程序类扩展您的应用程序框架类而不是 JavaFX 类)。
  4. 编写您自己的 LauncherImpl,为您的应用程序设置类加载器、创建应用程序类的实例并调用您想要在应用程序类型上使用的任何启动入口点。
  5. 运行您的应用程序,放置被破解的 sun.launcher.LauncherHelper 版本和 LauncherImpl on the boot class path ,这样它们就会被选中,而不是 JDK 附带的默认版本。

示例启动命令,假设要启动的目标应用程序是com.mycompany.MyApplication:

java -Xbootclasspath/p <launcher class directory> com.mycompany.MyApplication

关于java - 如何创建自定义 JVM 启动器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com