【问题标题】:How to get the plugins in Eclipse workspace如何在 Eclipse 工作区中获取插件
【发布时间】:2018-03-07 14:09:18
【问题描述】:

我曾经使用过 IPluginRegistry 来获取所有插件,但现在在新版本中,它的一些方法实现已被删除,例如 getPluginRegistry。

IPluginRegistry pReg = Platform.getPluginRegistry();
IPluginDescriptor[] plugins = pReg.getPluginDescriptors();
IPluginPrerequisite[] pPrereqs = plugins[i].getPluginPrerequisites();

上面的代码有替代方案吗?

我也不能像下面的 Eclipse 4.3 中的插件 ID 获取插件,getPlugin(plugin_id) 方法已被弃用,并在新版本中删除了它们的实现。下面的代码也有其他选择吗?

Plugin plugin = Platform.getPlugin(pluginId);
boolean bool = plugin instanceOf MyCustomPlugin;

MyCustomPlugin.java

public abstract MYCustomPlugin extends AbstractUIPlugin{
}

如果我使用下面的捆绑包,我只能获得没有插件名称的包名称,例如 com.plugins.pluginPack 而不是 com.plugins.pluginPack.MyCustomPlugin。我需要完整的插件,而不仅仅是包名。

Bundle bundle = Platform.getBundle(pluginId);

如果有人帮助我,我将不胜感激! 谢谢。

【问题讨论】:

  • 为什么需要这个?当我们不确切知道您想要什么数据时,就更难回答了。
  • @greg-449 我的代码需要 pluginPrerequisites。如果您能帮助我,我将不胜感激!

标签: java eclipse eclipse-plugin osgi-bundle


【解决方案1】:

您可以使用平台状态来获取已安装捆绑包描述的列表:

State state = Platform.getPlatformAdmin().getState();
BundleDescription [] bundles = state.getBundles();

BundleDescription 具有诸如 getRequiredBundles 之类的方法,它们返回捆绑包要求的列表。

BundleSpecification [] specs = desc.getRequiredBundles();

您无法再获取插件的Plugin,您可以使用以下方法获取插件的Bundle:

Bundle bundle = Platform.getBundle("plugin id");

由于插件类只有一个实例,您可以在类中使用静态来保存该实例 - 例如ResourcesPlugin 这样做:

public final class ResourcesPlugin extends Plugin {
  private static ResourcesPlugin plugin;

  public ResourcesPlugin() {
    plugin = this;
  }

  public static ResourcesPlugin getPlugin() {
    return plugin;
  }
}

【讨论】:

  • 谢谢@greg-449。但我还有一个问题,Plugin pugin = Platform.getPlugin(pluginId) 不再工作了,你能帮我找一个替代流程,从'pluginId' 获取'Plugin' 请
  • 那根本不再可用。同样,您需要解释您需要它的用途。您可以获取Bundle,其中包含一些信息 - 添加到答案中。
  • @greg449 我需要检查插件是否是 MyCustomPlugin 的实例
  • 插件类只有一个实例,因此您可以将实例保存在插件激活器中 - 请参阅ResourcesPlugin 的示例我找不到任何其他方式来访问激活器的详细信息
  • 所以,你能告诉我如何从捆绑包中获取所有插件,因为捆绑包没有插件名称,它只包含插件包名称com.myplugin.customPlugin,而不是插件名称@987654336 @!!
【解决方案2】:

因为 IPluginDescriptor 不再支持所以,对于“插件描述符”uniqueIdentifier,我们可以使用 bundle

Myplugin plugin;  //this Myplugin extending Plugin abstract class

IPluginDescriptor pluginDescriptor = plugin.getDescriptor();
String uniqueIdentifier = pluginDescriptor.getUniqueIdentifier();

**替代(下)

String uniqueIdentifier = plugin.getBundle().getSymbolicName()

对于插件对象,您可以使用 bundle 和 org.osgi.framework.Constants 找到替代方法

Plugin plugin = Platform.getPlugin(pluginId);

**替代(下)

Bundle bundle = Platform.getBundle(pluginId);
String activator = (String)bundle.getHeaders().get(Constants.BUNDLE_ACTIVATOR);
Object activatorInstance = bundle.loadClass(activator).newInstance();
Plugin plugin = (Plugin) activatorInstance;

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 2014-06-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2013-05-16
    • 2010-11-04
    相关资源
    最近更新 更多