既存のEclipseプラグイン拡張をオーバーライドする

拡張ポイントを提供する既存のEclipseプラグインがあります。このプラグインは標準のEclipseメカニズムを使用して拡張機能を検索します。このプラグインのコードでは、次のコードを使用して拡張機能を取得します。

IConfigurationElement[] config = Platform.getExtensionRegistry()
            .getConfigurationElementsFor(extensionPoint);
if (config.length > 0) {
    return config[0];
}

コードでわかるように、最初に見つかった拡張子のみが使用されます。このプラグインはすでに拡張機能を提供していますが、この拡張機能はデフォルトの場合に使用されます。

今私はデフォルトの拡張機能の動作を変更する必要があるので、私は新しいプラグインを作成し、同じ拡張ポイントを拡張します。しかし、デフォルトの拡張は常に IConfigurationElement 配列の最初の拡張であることが分かります。

見つかった IConfigurationElement 配列の中で自分のプラグインを最初に表示させるにはどうすればいいですか?

既存のプラグインは他人によって書かれており、絶対に必要になるまでは変更を加えたくありません。

2

1 答え

私はこれが拡張ポイントからいずれかの方法で拡張を得る悪い方法だと言っています。彼らが作成した特定の拡張をロードするプラグインシステムを使用したい場合は、代わりに getConfigurationElementsFor(String namespace、String extensionPointName、String extensionId)メソッドを使用して、他の人が使用できるようにすることができます拡張ポイント。現在のところ、どの拡張子が得られるかは分かりません。チャンスは、彼らが拡張を得ると仮定して、後でコード内にインスタンスがあり、彼らが期待する拡張を得られないときに、ClassCastExceptionがドアをノックするということです。 (システムの中でこのようなバグが一度あった)

もちろん、最良の方法は、コードを変更して多くの拡張機能を処理することです!

しかしあなたの質問に。 ExtensionRegistryが配列をどのように満たしているのかわかりませんが、APIは言いません。おそらく、配列の最初に置くことができる拡張の特定のバージョンを設定する方法があるかもしれません。 Extensionがどのように見つかったかを正確に知るためには、ExtensionRegistryのコードを調べなければなりません。私はそれがアルファベット順であるかもしれないと思うが、わからない。

Another way is to overload the existing plugin with your plugin and replace functionality. A very dirty approach, but in some cases it is doable. See one of my questions regarding this

1
追加された
ExtensionRegistryは非決定的な方法で拡張を返します。つまり、別のコンピュータに異なる順序でプラグインをインストールすると、最初に上書きが返されますが、保証はありません。彼らが望む拡張機能をソート/優先順位付け/選択するのは、拡張ポイントの消費者の仕事です。
追加された 著者 Paul Webster,