3

私はEclipseプラグインを持っており、サポートする最小バージョンとして3.1または3.2を目指しています。問題は、私のコードの一部がバージョン3.5以降でしか機能しないことです(他の質問を参照してください:EclipseにCaretListenerの代替手段はありますか?)。

古いバージョンで動作するコードと新しいバージョンで動作する別のコードがあるので、プラグインがバージョン3.5以降で実行されている場合にのみ新しいコードを呼び出して、古いコードに戻す方法はありますか?古いものを実行している場合は?

テストとして、同じクラスを持つ2つのプラグインを作成しました(わずかに異なることを行うだけです)。org.eclipse.uiの依存関係を一方のプラグインで最小3.5として、もう一方のプラグインで最小として3.1としてマークしましたが、3.5に依存するプラグインを古いバージョンで無視することはできません...

誰か助けてもらえますか?

ありがとう、アラン

4

2 に答える 2

2

バンドルorg.eclipse.core.runtime.Platformを取得してバージョンを確認するために使用できます。org.eclipse.ui

Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
// then do something with that

MyListener>=3.5 の場合は登録し、それ以外の場合は登録しOldMyListenerます。

編集:

そうです、上記は実行時の動作の違いを捉えるのにのみ適しています。

Eclipse は、一部のクラスのみをロードするためのいくつかのトリックをサポートしています。

開発の観点から最も簡単なのは、@ShiDoiSi が言及したトリックです。

Bundle myBundle = org.osgi.framework.FrameworkUtil.getBundle(this.class);
Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
Version cutOff = new Version(3,5,0);
final Executable processListener;
if (ui.compareTo(cutOff)<0) {
    Class pc = myBundle.loadClass("my.pkg.OldListenerProcess");
    processListener = (Executable) pc.newInstance();
} else {
    Class pc = myBundle.loadClass("my.pkg.ListenerProcess");
    processListener = (Executable) pc.newInstance();
}
processListener.execute(targetObject);

Eclipse フレームワークをさらに使用する別のオプションは、独自の拡張ポイントを定義して、他のバンドルからの貢献が使用するバージョンを決定できるようにすることです。基本的には上記と同じパターンですが、Executable実行に貢献するプラグインの依存範囲によってバージョン チェックが行われます。古い方法では org.eclipse.ui [0.0.0,3.5.0) に依存し、現在の方法では単に org.eclipse.ui 3.5.0 (これは 3.5.0 では制限のない範囲です) を指定するだけです。次に、拡張機能を読み取り、提供されたクラスをインスタンス化できます。

このために追加のプラグインを作成する場合 (2 つの違いが少し重い)、メイン プラグインでコマンドを定義し、追加のプラグインに同等のハンドラーを提供させることができます。<3.5 または >=3.5 の場合に 1 つだけがロードされるように、プラグインには依然として依存関係の範囲が必要です。次に、コマンド API を使用してコマンドを実行できます (そして、正しいハンドラーが実行されます)。

ICommandService cmdS 
  = (ICommandService) workbenchWindow.getService(ICommandService.class);
Command process = cmdS.getCommand("my.pkg.ListenerProcess");
ParameterizedCommand cmd = new ParameterizedCommand(process, null);
IHandlerService handlerS 
  = (IHandlerService) workbenchWindow.getService(IHandlerService.class);
IEvaluationContext ctx = handlerS.createContextSnapshot(false);
ctx.addVariable("toAddListener", targetObject);
handlerS.executeCommandInContext(cmd, null, ctx);

次に、ハンドラーの実装を使用HandlerUtil.getVariable(event, "toAddListener")して、ExecutionEvent から必要なオブジェクトを抽出します。

于 2011-10-27T11:20:54.503 に答える
0

2 つのプラグインを提供する必要があるように思えます。1 つはバージョン 3.1 から 3.5 の「すぐ下」までをサポートし、もう 1 つは 3.5 以降をサポートします。したがって、実際に選択することはできません。基本的には、バージョン範囲に基づいて適切なものを選択する Eclipse プラグイン レイヤーです。

または、コンパイル済みのクラス ファイルのみを提供する場合は、もちろん、実行中の Eclipse のバージョンのテストに基づいて、必要なクラスを動的にロードできます。

于 2011-10-28T11:57:06.580 に答える