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

时间:2018-03-07 14:09:18

标签: java eclipse eclipse-plugin osgi-bundle

我不习惯使用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);

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

2 个答案:

答案 0 :(得分:0)

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

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;
  }
}

答案 1 :(得分:0)

因为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;
相关问题