当前位置: 首页 > 面试题库 >

一个人如何创建自定义的JVM启动器?

沈开畅
2023-03-14
问题内容

历史上一直存在“ 如何在没有主要方法的情况下启动应用程序 ”的问题,大多数都沿用“ 您不能
”的方式陈述。我注意到现在如何可以通过扩展来启动JavaFX应用程序Application。我一直在使用与相似的方法Application.launch(),但是在这种情况下,我始终将主要方法视为样板代码。因此,我再次开始寻找答案。

我找到了这个答案,将我们链接到可以学习如何创建自己的JVM启动器的地方,但不幸的是,该文章不再存在。我花了很长时间寻找可能暗示我应该做什么的东西,但没有结果。

我的问题

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

class MyApplcation extends App {

}

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

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


问题答案:

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

由于实施了JEP
153
,因此可以启动不包含主要方法的JavaFX应用程序:增强Java命令行启动器以启动JavaFX应用程序。

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

通过代码跟踪实现:

  1. main.c中的JVM调用JLILaunch在java.c
  2. java.c 长相 Java类sun.launcher.LauncherHelper和调用到使用JNI的Java类,调用checkAndLoadMain功能
  3. 如果要启动的类没有main方法,但是扩展了JavaFX应用程序类,则将创建一个FXHelper类,其中包含启动参数。
  4. 通过JNI将对FXHelper的引用返回到java.c。
  5. java.c 调用的上FXHelper主要方法通过JNI。
  6. FXHelper 使用反射来调用com.sun.javafx.application.LauncherImpl.launchApplication()。
  7. JavaFX LauncherImpl将设置应用程序类加载器,然后首先尝试在应用程序的主类上调用main()方法。
  8. 如果没有main()方法,则JavaFX LauncherImpl将启动JavaFX Launcher线程。
  9. 在启动器线程上,LauncherImpl将在JavaFX应用程序上调用init()。
  10. 在JavaFX应用程序线程上,LauncherImpl将创建一个新的Stage(窗口),并将其传递给应用程序的start方法。
  11. 当最后一个阶段关闭或退出JavaFX平台时,应用程序上的stop方法由LauncherImpl 调用。
  12. 因为没有其他事情要做,所以所有的调用跟踪都将返回并且应用程序将退出。

如何自定义启动器

  1. 取得sun.launcher.LauncherHelper代码的副本。
  2. 忽略代码顶部的警告“这不是Sun Microsystems支持的任何API的一部分。如果编写依赖于此的代码,则后果自负。此代码及其内部接口可能会更改或更改。删除,恕不另行通知。” 并开始修改代码。
  3. 创建您自己的FXHelper版本,它将调用您自己的LauncherImpl而不是JavaFX版本(在目标主应用程序类扩展您的应用程序框架类而不是JavaFX的情况下)。
  4. 编写自己的LauncherImpl,为您的应用程序设置类加载器,创建应用程序类的实例,并在应用程序类型上调用所需的任何启动入口点。
  5. 运行您的应用程序,将被黑化的sun.launcher.LauncherHelper版本和您的LauncherImpl 放在引导类路径上,以便获取它们,而不是JDK附带的默认版本。

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

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


 类似资料:
  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方

  • 在Elasticsearch中,我想用我的自定义分析器索引一些字段。因此,首先,我将分析器添加到其他配置中 Liferay公司- 其他索引配置 覆盖类型映射 在Liferay Elasticsearch中添加此属性后,我重置了索引,重新启动了Liferay。Portal使用我的映射和分析器正确创建了一个新索引。然后我重新索引了我的文档。当我在Elasticsearch中搜索某物时,它会显示预期的结

  • 问题内容: 一个项目需要大量使用以下Jackson注释组合。因此,有没有一种方法可以创建另一个注释来避免丑陋的复制/粘贴: 更新: 我已经尝试过了,但是没有成功:-( 问题答案: 使用解决问题:

  • 我正在编写一个定制的spring starter,其中需要根据应用程序中定义的属性注册一个相同类型的bean列表。属性 我在应用程序中有以下属性。属性 自动配置类的当前实现如下 我想简单地在spring boot应用程序中用qualifer自动连接我的bean,如下所示 如何更改autoconfigure类以创建多个具有属性文件中定义的不同名称的bean(在本例中,如何创建bean mybean2

  • 本文向大家介绍Android如何创建自定义ActionBar,包括了Android如何创建自定义ActionBar的使用技巧和注意事项,需要的朋友参考一下 当多个界面都有很多相似部分时,可以考虑创建一个功能较全的模板。而在需要时,可以通过引用模板来实现自己想要实现的功能。比如适配器 Adapter,当很多的适配器都差不多时,就可以通过打造一个通用的适配器来实现。本例中主要是如何创建自定义的 Act

  • 标题说明了一切。我想创建一个自定义的prestashop页面,但我不知道如何创建。我真正想做的是:创建一个按钮,打开一个自定义页面。我在网上找不到任何有用的东西,所以我来这里寻求帮助。有人能告诉我怎么做吗?