如何在 Eclipse 工作区中获取插件

How to get the plugins in Eclipse workspace

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

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

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

此外,我无法像下面在 eclipse 4.3 中那样从 plugin-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);

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

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

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

BundleDescription 具有诸如 getRequiredBundles 之类的方法 return 捆绑包要求的列表。

BundleSpecification [] specs = desc.getRequiredBundles();

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

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

因为插件的 class 只有一个实例,所以您可以在 class 中使用静态来保存该实例 - 例如 ResourcesPlugin 这样做:

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

  public ResourcesPlugin() {
    plugin = this;
  }

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

因为 IPluginDescriptor 不再支持所以,对于 "plugin descriptor" 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;