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

时间:2015-03-07 19:42:12

标签: java eclipse-plugin osgi equinox osgi-bundle

我正在开发一个Eclipse插件,需要弄清楚Eclipse启动所花费的时间。

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

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

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

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

我觉得在早期的初始级别(2)运行的自定义OSGi包可能会有类似的东西。但是,我不确定它是否真的有效:

  • 也许工作区选择对话框显示在一些Eclipse核心插件中,从其他插件开始在起始级别4开始?
  • 即使我设法编写这样的包,我是否需要修改Eclipse config.ini以将其列在那里?或者我如何保证它将在某个启动级别启动(如果它不是真正的Eclipse插件而是自定义捆绑包)? This article提及p2.inf,但我的实验尚未成功。

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


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

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

1 个答案:

答案 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子目录中。)