在Eclipse开发过程中,编写插件启动类(Activator)代码时候的注意点,简要列举如下。
众所周知,org.eclipse.core.runtime.Plugin类中最核心的两个方法:start和stop,开发者通过覆写这两个方法,可以参与到osgi framework针对你贡献的Bundle的生命周期管理。注意点和简要理由列举如下:
1、
start方法中只干必须要干的事情。不是插件启动的必要条件的东西,一律不要防止到start逻辑中。根据
个人经验,这种场景非常少,常用的功能是在AbstractUIPlugin启动的时候申请系统资源。
【常犯的错误】
最近发现一些人写start逻辑的时候,喜欢包含扩展加载的代码(自己定义了一个扩展点,在插件启动逻辑代码中预加载扩展)。完全不必要这么做,第一操作Eclipse扩展注册表本身是比较耗时的操作,而且如果加载的代码逻辑中包含了创建类实例的代码(IConfigurationElement.createExecutableExtension),很可能引起其他扩展插件的过早启动
2、start方法中的自定义逻辑代码一定要确保安全。否则,可能一个简单的异常情况就使得你辛苦写的插件当掉了~_~,而且会间接引起对应扩展插件也启动不了
3、如果start方法中干了活有一定耗时的嫌疑,简单的用时间戳测试一下大致的耗时
【常见的错误】
Eclipse底层在加载新类型的时候,会启动一个新的线程,而且该线程设置的超时限制。Eclipse加载你贡献的插件中的类型时,肯定要先启动你的插件。如果你的启动逻辑过于耗时,则有可能引起类加载超时的问题,最可恶的是,这种问题具有一定的偶然性
4、建议保存Eclipse默认提供的Plugin Activator。发现有些人喜欢删除默认的启动类,他感觉他的插件不需要编写额外的启动逻辑代码。个人建议不要这么做,因为很多底层问题需要调试到插件启动的层面来判断,保留默认启动类,便于调试和跟踪插件的启动
5、要假设stop方法只有在Eclipse实例退出的时候才被调用。关于这个问题的分析,最近两天有时间我会额外写一篇文章来分析一下(一般只有osgi framework在osgi应用退出的时候或者osgi console命令行管理中会调用这两者,自己一般不要去调用)。
【常犯的错误】
不少开发者假设自己写的插件真的会在不需要的时候被stop,这种想法过于天真。(首先如何判断不被需要对osgi的实现者来说就是很大的挑战,尤其是设计到有状态服务等的时候....这个问题很复杂,以后有机会和大家讨论)
6、在starp和stop逻辑代码中,尽量不要去显式敢于Eclipse对插件生命周期的管理。这可能会引起很多莫名其妙的问题(请相信我,我曾经很多次用Bundle.start来启动我想启动的插件,结果出现见鬼的问题。以后和大家分享)。
【常犯的错误】
开发者显示调用Bundle的start和stop来控制一个目标插件,千万不要轻易这么干!!!如果想预启动,尽量使用Eclipse提供的startup扩展点,其在app laucher中会帮你预启动。
其他的问题,一时想不起来了。希望对插件开发的同行有帮助!
本博客中的所有文章、随笔除了标题中含有引用或者转载字样的,其他均为原创。转载请注明出处,谢谢!