gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:24:58 27 4
gpt4 key购买 nike

如何在没有 main 方法的情况下启动应用程序”问题的历史一直存在,大多数都是“你不能”这样的问题。我注意到现在如何通过扩展 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 启动器逻辑的修改,以检查要启动的类是否扩展了应用程序,如果是,则调用启动 Java 运行时和相关线程的 JavaFX 特定启动器,创建一个 GUI 窗口(在JavaFX 称为阶段),然后创建 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. 调用 uses reflection 的 FXHelper 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/29424612/

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