我正在寻找实现特定扩展点的扩展,并使用以下可接受的方法来执行此操作:
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。
答案 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)或引用代码中描述的信息。