バンドル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 から必要なオブジェクトを抽出します。