如何在 Eclipse 启动后立即 运行 一些代码?

How to run some code as soon as Eclipse has started?

我正在开发一个 Eclipse 插件,它需要计算 Eclipse 启动所花费的时间。

我可以通过使用 org.eclipse.ui.startup 扩展点并使用 ManagementFactory.getRuntimeMXBean().getUptime()eclipse.startTime 系统 属性 记录时间来获取我的插件中自 JVM 启动以来的时间量.

但是,在启动期间,Eclipse 可能会要求用户提供工作区位置,这将计入 JVM 启动时间。由于我的插件试图测量非用户交互时间,这使得上述方法变得毫无用处(除非用户选择了默认工作区位置,但不能保证是这种情况)。

理想情况下,我想知道用户关闭 "choose workspace" 对话框的时间(或者,如果用户使用的是默认工作区,那么等效时间)。或者其他一些尽可能接近的时刻。

我做了一些研究,似乎没有任何正式的扩展点。

我有一种感觉,在足够早的启动级别 (2) 中使用自定义 OSGi 包 运行 可能会发生类似的事情。但是,我不确定它是否真的有效:

由于我没有太多的 OSGi 和 Eclipse 插件开发经验,也许我错过了一些相当明显的东西并且解决方案比我预想的要简单得多?


更新 经过更多研究,我发现了一个早期的扩展点:StartupMonitor 服务(通常用于自定义启动画面或提供某种其他类型的启动进度监视器,请参阅 here 了解更多详细信息)。这可能是满足我需求的候选者,现在我只需要弄清楚如何让 Eclipse 知道它(我怀疑我需要在 config.ini 中添加它)。

我正在考虑的另一个选择是实施 JVM 代理和工具 Eclipse IDEApplication class,添加一些我需要的代码片段。然后在 eclipse.ini 中的 JVM 参数中添加该 JVM 代理。实际上可能是最简单的。

我采用了 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 子目录中)。