如果所有扩展程序都可用,我该如何运行?

时间:2015-07-13 20:40:32

标签: eclipse-plugin osgi eclipse-rcp

我正在尝试了解Eclipse插件生命周期的安全性与安全性。

背景

Eclipse / RCP / OSGI框架中的某些内容允许bundle提供扩展点,从而允许bundle之间的循环依赖。如果bundle X 提供扩展点,Bundle Y 可能都依赖于bundle X ,并提供实现接口或扩展类的扩展 X 已知,并使该扩展可用于捆绑 X

然后是激活者的承诺:据我所知,我们承诺,在捆绑包中的任何类可用于任何其他捆绑包之前,您的激活器start(BundleContext)方法将被调用,并且您的依赖关系' start(...)方法将在您之前调用。

限制/可能的矛盾

现在,我已准备好描述我的难题:我想尽快检索特定扩展点的所有提供者;这样做的简单方法似乎是在我的捆绑的激活器中。

但是,如果我所描述的Eclipse / RCP / OSGI框架所做的承诺是正确的,那么我很确定在激活期间我不应该这样做:

要么(1)我将在调用start(...)方法之前引用我的一个依赖项提供的类,或者(2)必须调用我的依赖项的start(...)方法在我之前,或(3)不会发生违规行为,但我将检索零扩展,因为依赖于我的插件无法在我之前启动,因此我们的扩展点的实现尚不可用。

为什么我在启动时需要扩展

我的挑战是我需要在我的插件启动后尽快加载一些数据,但我需要确保首先加载我的扩展,因为有问题的扩展是我需要的数据的数据格式的扩展载入;如果我先加载数据,它会失败或被破坏。

我也想知道我的Eclipse插件生命周期的图片是否正确,因为尽管搜索了插件生命周期的讨论,但我没有遇到任何有关其限制的警告;我相当肯定有可能做错事并造成严重问题,而且我想了解在什么情况下会出问题所以我可以避免产生问题。

1 个答案:

答案 0 :(得分:1)

The extension point registry accessed by the IExtensionRegistry interface will tell you about extension points without starting any of the plugins involved.

IExtensionRegistry extReg = Platform.getExtensionRegistry();

In the registry for an extension point you will have a number of IConfigurationElement entries describing the individual extensions declared by plugins. It is only when you call the createExecutableExtension method of this interface that the the contributing plugin is started.

Note: A plugin's activator start method is not normally run until Eclipse needs to run some other code in the plugin - it does not run at Eclipse startup unless you force it too.