在plugin.xml中配置扩展点和扩展内容是一种静态的让Osgi认识我们自己写的程序内容的方法。这个方法具有一定的局限性。
笔者最近在写一套通用组件的时候遇到了需要通过其他途径动态Osgi加载组件/类的情况。例如动态记载 快捷键 捆绑命令。
于是利用Osgi的ExtensionRegistry实现动态加载扩展。
以下以加载首选项Page扩展举例:
- public static void registryPreferencePageExtension(Bundle bundle) throws FileNotFoundException, UnsupportedEncodingException{
- ByteArrayInputStream is =
- new ByteArrayInputStream(getFile().getBytes("UTF-8"));
- // use Eclipse Dynamic Extension API
- IExtensionRegistry reg = RegistryFactory.getRegistry();
- Object key = ((ExtensionRegistry)reg).getTemporaryUserToken();
- IContributor contributor =
- ContributorFactoryOSGi.createContributor(bundle);
- reg.addContribution(is, contributor, false, null, null, key);
- }
- public static String getFile() {
- StringBuffer sb = new StringBuffer();
- sb.append("<?xml version=/"1.0/" encoding=/"UTF-8/"?>");
- sb.append("<plugin>");
- sb.append("<extension point=/"org.eclipse.ui.preferencePages/">");
- sb.append("<page category=/"com.ibm.chas.ui.preference.MainPreferencePage/"");
- sb.append(" class=/"com.ibm.chas.emr.tmpltdesigner.preferences.MyPreferencePage/"");
- sb.append(" id=/"com.ibm.chas.emr.tmpltdesigner.preferences.MyPreferencePage/"");
- sb.append(" name=/"Template Designer Preference/"/>");
- sb.append("</extension>");
- sb.append("</plugin>");
- return sb.toString();
- }