开发一个SQL的编辑器插件,扩展名为sql,但运行后,用file -> open file...打开test.sql文件,Activator能够构造,但编辑器打不开,添加调试信息,发现ZSqlEditor类根本没有构造。也没有任何错误信息提示。因此判断错误发生在系统加载插件类的过程中(Eclipse用Java反射从磁盘动态加载插件的类文件)。
打开runtime workbench下的.log文件,发现Eclipse在加载插件时出现NoClassDefFoundError,如下:
java.lang.NoClassDefFoundError: org/eclipse/jface/text/source/ISourceViewer
但是开发过程中并没有提示错误,打开目标平台设置,org.eclipse.jface.text插件也在列表中选中。
经过检查发现,开发过程中在project->properties中对org.eclipse.jface.text_ 3.2.2 .r322_v20070104.jar(插件)的引用是定位到磁盘的硬引用。而不是出现在plugin dependencies中,造成了运行时找不到类的错误。解决方法如下:
a) 将这个硬引用删除。
b) 使用plugin manifest编辑器下的dependencies选项卡添加对org.eclipse.jface.text插件的引用。问题解决。(或者在plugin.xml的<requires>节中或者在MANIFEST.MF的require-bundle节中添加对org.eclipse.jface.text插件的引用也可)
总结:关于插件开发中,对于第三方类的引用和对于其他插件的引用请参考另一篇文档《Eclipse插件开发中对于Jar包和类文件引用的处理》