我正在开发一个Eclipse插件,需要弄清楚Eclipse启动所花费的时间。
通过使用org.eclipse.ui.startup
扩展点并使用ManagementFactory.getRuntimeMXBean().getUptime()
或eclipse.startTime
系统属性记录时间,我可以在插件中获取自JVM启动以来的时间。
但是,在启动期间,Eclipse可能会询问用户工作区位置,这将在JVM启动时计算。由于我的插件试图测量非用户交互时间,这使得上述方法相当无用(除非用户选择了默认工作空间位置,但不能保证是这种情况)。
理想情况下,我想知道用户解雇"选择工作空间的时刻"对话框(或者,如果用户使用默认工作区,那么等效时刻)。或者其他一些尽可能接近的时刻。
我做了一些研究,似乎没有任何正式的延伸点。
我觉得在早期的初始级别(2)运行的自定义OSGi包可能会有类似的东西。但是,我不确定它是否真的有效:
config.ini
以将其列在那里?或者我如何保证它将在某个启动级别启动(如果它不是真正的Eclipse插件而是自定义捆绑包)? This article提及p2.inf
,但我的实验尚未成功。由于我对OSGi和Eclipse插件开发没有太多经验,也许我错过了一些相当明显的东西,解决方案比我想象的要简单得多?
更新
经过一番研究后,我发现了一个早期扩展点:StartupMonitor服务(通常用于自定义启动屏幕或提供其他类型的启动进度监视器,有关详细信息,请参阅here)。这可能是我的需求的可能候选者,现在我只需要弄清楚,如何让Eclipse意识到它(我怀疑我需要在config.ini
中添加它。)
我考虑的另一个选择是实现JVM代理和工具Eclipse IDEApplication类,添加一些我需要的代码片段。然后在eclipse.ini
中的JVM参数中添加该JVM代理。实际上可能是最简单的。
答案 0 :(得分:0)
我采用了JVM代理方法。幸运的是P2能够通过touchpoints执行一些额外的操作 - 我可以使用它在插件安装时自动添加JVM代理选项,并在卸载插件时将其删除。
示例p2.inf
文件(进入META-INF
):
instructions.install = \
addJvmArg(jvmArg:-javaagent:${artifact.location}/agent/my-agent.jar);
instructions.install.import = \
org.eclipse.equinox.p2.touchpoint.eclipse.addJvmArg, \
org.eclipse.equinox.p2.touchpoint.eclipse.removeJvmArg
instructions.uninstall = \
removeJvmArg(jvmArg:-javaagent:${artifact.location}/agent/my-agent.jar);
instructions.uninstall.import = \
org.eclipse.equinox.p2.touchpoint.eclipse.addJvmArg, \
org.eclipse.equinox.p2.touchpoint.eclipse.removeJvmArg
(上面的示例假定您已将JVM代理程序捆绑在插件中,位于agent
子目录中。)