gpt4 book ai didi

eclipse - 从 Eclipse IConfigurationElement 获取 OSGI Bundle

转载 作者:行者123 更新时间:2023-12-03 05:24:38 25 4
gpt4 key购买 nike

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

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

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

然后我想获取定义包的版本。我将使用以下 API,但 PluginVersionIdentifier 的 API 已弃用:

for (IConfigurationElement e : 配置) { BlueprintTemplate 模板 = new BlueprintTemplate();

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

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

最佳答案

所有这些信息均基于 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 。

关于eclipse - 从 Eclipse IConfigurationElement 获取 OSGI Bundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3043828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com