从Eclipse IConfigurationElement获取OSGI Bundle

时间:2010-06-15 09:01:01

标签: eclipse osgi

我正在寻找实现特定扩展点的扩展,并使用以下可接受的方法来执行此操作:

IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();   if(extensionRegistry == null){    返回模板;   }

IConfigurationElement [] config = extensionRegistry.getConfigurationElementsFor(“com.ibm.im.launchpoint.templates.template”);

然后我想获得定义包的版本。我会使用以下API,但不推荐使用PluginVersionIdentifier的API:

for(IConfigurationElement e:config){    BlueprintTemplate template = new BlueprintTemplate();

IExtension declaringExtension = e.getDeclaringExtension();    PluginVersionIdentifier versionIdentifier = declaringExtension.getDeclaringPluginDescriptor()。getVersionIdentifier();

我在新API中找不到替代方法 - 即从IConfigurationElement中,我如何获取bundle的版本ID描述符。显然,从Bundle我可以使用Bundle.getHeaders()获取版本,获取Bundle-Version值 - 但我如何获得Bundle? Platform.getBundle(bundleId)是不够的,因为我可能安装了同一个bundle的多个版本,我需要知道我是谁。目前我有鸡肉和鸡肉。鸡蛋情况,我唯一的解决方案是上面弃用的API。

2 个答案:

答案 0 :(得分:4)

所有这些信息都基于Eclipse 3.6:

如果您在osgi环境中,那么IContributor将成为RegistryContributor的实例,当然您或者您不会遇到此问题。

RegistryContributor为您提供了两种方法:getID()getActualID()getID()可能会返回主机包,如果它是从片段加载的。 getActualID()始终加载贡献者所代表的片段/包的id。您可以在BundleContext.getBundle(long id)方法中使用此ID。这是一个片段:

Bundle bundle;
if (contributor instanceof RegistryContributor) {
  long id = Long.parseLong(((RegistryContributor) contributor).getActualId());
  Bundle thisBundle = FrameworkUtil.getBundle(getClass());
  bundle = thisBundle.getBundleContext().getBundle(id);
} else {
  bundle = Platform.getBundle(contributor.getName());          
}

如果IContributor将来获得新的默认实现,我会使用一种降低方法,该方法会优雅地降级为非版本感知解决方案。 bundle id对于OSGi的实例是唯一的,因此它将加载正确的bundle版本。

答案 1 :(得分:0)

我建议浏览一下Javadoc弃用说明,记录替换。我找到了以下代码,但没有测试它。

String contributor = e.getDeclaringExtension().getContributor().getName();
Bundle bundle = Platform.getBundle(contributor);
Version versionInfo = bundle.getVersion();

出于好奇:你为什么需要获得扩展插件的版本?据我所知,扩展点机制的目标是分离有关扩展程序的特定信息,只需要扩展(plugin.xml)或引用代码中描述的信息。