私は 3 つの RCP プラグインのセットを持っています。1 つはメイン アプリケーション プラグイン、もう 1 つは計算のコレクション、3 つ目は GridGain のラッパーです。これは、特に計算プラグインからクラスのインスタンスを作成する必要があります。
メイン プラグインは、ExtensionPoint インスタンス化を使用して、計算プラグインと GridGain プラグインの両方からクラスをインスタンス化します。
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint providerExtensionPoint = registry.getExtensionPoint(EXT_CORE_DATA_PROVIDERS);
IConfigurationElement[] providers = providerExtensionPoint.getConfigurationElements();
List<DataProviderFactory> dataProviders = new ArrayList<DataProviderFactory>();
for (IConfigurationElement member : providers) {
try {
Object obj = member.createExecutableExtension(K_CLASS);
if (obj instanceof DataProviderFactoryFactory) {
DataProviderFactoryFactory factory = (DataProviderFactoryFactory) obj;
for (Object o : factory.createProviderFactories(this, holdingProperties())) {
dataProviders.add((DataProviderFactory) o);
}
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
return dataProviders;
したがって、他のプラグインに直接依存することはありません。
私の問題は、GridGain が計算プラグインからクラスのインスタンスをインスタンス化する必要があるときに発生します。GridGain プラグインは計算プラグインに直接依存していないため、クラスをロードするプロセスではそこにクラスが表示されないため、ClassNotFoundException が発生します。
過去にRCP バディ ポリシーを使用して同様の問題を解決しましたが、これは ORM で直面する問題と同様の問題のようです。ただし、「登録済み」ポリシーは、クラスを定義するプラグイン (私の場合は計算プラグイン) がそれらをインスタンス化するプラグイン (GridGain プラグイン) に依存しているという事実に依存します。私のシナリオでは、そのような依存関係はありません。したがって、BuddyPolicy: registered を GridGain に追加し、RegisterBuddy: gridgain を計算プラグインに追加しても機能しません。
GridGain プラグインが計算プラグインからクラスを解決する唯一の方法は、GridGain を計算に依存するものとして明示的に定義することです。私の考えでは、それは必要ないはずです。計算プラグインが存在する場合、GridGain がそこからクラスをインスタンス化できるソフトな依存関係にする方法があるはずです。クラスローディングの問題が解決するように、この相互依存関係をモデル化する別の方法はありますか?