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

Java 如何创建自定义JVM启动器?,java,jvm,launcher,Java,Jvm,Launcher,“如何在没有主方法的情况下启动应用程序”的问题由来已久,大多数问题都是“你不能”这样的。我注意到现在只需扩展应用程序就可以启动JavaFX应用程序。我一直在使用类似于Application.launch()的方法,但在这种情况下,我总是将主方法视为样板代码。于是我又开始寻找答案 我发现我们可以从中了解如何创建自己的JVM启动器,但遗憾的是,这篇文章已经不存在了。我花了很长时间寻找任何可能暗示我应该做什么的东西,但没有结果 我的问题 如何创建一个定制的JVM启动器来根据扩展的内容启动应用程序?例如

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

我发现我们可以从中了解如何创建自己的JVM启动器,但遗憾的是,这篇文章已经不存在了。我花了很长时间寻找任何可能暗示我应该做什么的东西,但没有结果

我的问题

如何创建一个定制的JVM启动器来根据扩展的内容启动应用程序?例如,假设一个项目有一个声明的类:

class MyApplcation extends App {

} 
项目启动不需要主要方法,因为它扩展了应用程序。这不是问题,尽管这是我的目标。问题是如何创建自定义JVM启动器


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

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

可以启动不包含main方法的JavaFX应用程序,因为实现了

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

通过以下代码跟踪实现:

  • for JVM在中调用JLILaunch
  • java类的java.c,并调用函数
  • 如果要启动的类没有主方法,但有主方法,则会创建一个包含启动参数的类
  • 对FXHelper的引用通过JNI返回到java.c
  • 通过JNI访问java.c
  • 要调用的FXHelper
  • JavaFXLaunchImpl将设置应用程序类加载器,然后在应用程序的主类上设置第一个方法
  • 如果没有main()方法,JavaFXLauncheImpl将运行
  • 在launcher线程上,LauncherImpl将运行
  • 在JavaFX应用程序线程上,启动器impl将和
  • 当最后一个阶段关闭或JavaFX平台退出时,由LauncherImpl执行
  • 所有调用跟踪都返回,应用程序退出,因为没有更多的事情要做
  • 如何定制启动器

  • 抓取代码的副本
  • 忽略代码顶部的警告“这不是Sun Microsystems支持的任何API的一部分。如果您编写的代码依赖于此,您将自行承担风险。此代码及其内部接口可能会在不通知的情况下更改或删除。”并开始修改代码
  • 创建您自己版本的FXHelper,它将调用您自己的LauncheImpl而不是JavaFX(如果目标主应用程序类扩展了您的应用程序框架类而不是JavaFX类)
  • 编写自己的LaunchImpl,为应用程序设置类加载器,创建应用程序类的实例,并在应用程序类型上调用所需的任何启动入口点
  • 运行您的应用程序,放置被黑客攻击的sun.launcher.launchelper版本和您的launchempl,这样它们就会被接收,而不是JDK的默认版本 示例启动命令,假设要启动的目标应用程序是
    com.mycompany.MyApplication

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