3

私はEclipseプラグインを持っており、サポートするための最小バージョンとして3.1または3.2を目指しています。問題は、私のコードの一部がバージョン3.5以上でしか機能しないことです(他の質問:Is there an alternative to CaretListener in Eclipse?参照)。複数のバージョンのEclipseのサポート

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

テストとして、私は同じクラスを持つ2つのプラグインを作成しました(わずかに異なることをしています)。私はorg.eclipse.uiの依存関係を1つのプラグインで最低3.5、他のプラグインで最低3.1とマークしていますが、古いバージョンでは無視される3.5を使用することはできません。

誰でも手助けできますか?

おかげで、 アラン

+0

のEclipse 3.1/3.2?私はあなたが本当に古いEclipseのバージョンをサポートする必要がある場合は、まず自分自身に尋ねるべきだと思います。 3.1が2005年にリリースされました。顧客/クライアントの中には古いバージョンのEclipseを使用している人がいたら、アップグレードを促すことに集中する必要があります。 – Fredrik

+0

おかげフレドリックは、私はあなたのポイントが、バージョン3.4を取るだけで、2008年に出てきた - 少なくともこれをサポートするためにいいだろう。だから、私はそれが可能なのかどうかを調べることにはまだ興味があります。なぜならそれは問題である依存関係だけなのですから。 –

答えて

2

あなたはorg.eclipse.uiバンドルを取得し、バージョンを確認するためにorg.eclipse.core.runtime.Platformを使用することができます。

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

登録MyListenerは> = 3.5、およびOldMyListenerそうでない場合。

EDIT:

右は、上記の実行時の動作の違いをキャプチャするための唯一の良いです。

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つの違いが少し重い場合)、メインのプラグインにコマンドを定義し、余分なプラグインが同等のハンドラを提供できるようにします。プラグインは依存関係の範囲を持つ必要がありますので、1つだけが< 3.5または> = 3.5の場合にロードされます。コマンド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); 

その後ハンドラの実装は、あなたがExecutionEventから必要なオブジェクトを抽出するためにHandlerUtil.getVariable(event, "toAddListener")を使用します。

+0

私が正しくポスターを理解すれば、彼は、APIの違いについて話していたので、彼は2つ(相互に排他的)のインタフェースに対してコンパイルする必要があります。 – ShiDoiSi

+0

はい、私はAPIの違いについて話して、実行時にバージョンをチェックしていたことはオプションではありません。現時点では、私は最低3.5サポートを辞任していますが、他の提案は依然として高く評価されます。 –

0

バージョン3.1をサポートするプラグインが3.5の直下に、もう1つが3.5以上をサポートする2つのプラグインを提供しているはずです。したがって、実際には選択する必要はありません。基本的に、Eclipseプラグインレイヤーは、バージョン範囲に基づいて適切なものを選択します。

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

関連する問題