1

私のワークスペースには 4 つの Eclipse プラグイン プロジェクトがあります (新しい Java プロジェクトを作成し、右クリックして構成し、プラグイン プロジェクトに変換します)。最初の ( my.runtime) には、インターフェース ( ) と、そのインターフェースのすべての実装をロードしてメソッド ( )を呼び出し、結果を収集してリストに返すメソッド ( ) を定義するMyFactoryInterfaceクラス ( ) が含まれています。MyClientList<String> getAllFactoryNames()java.util.ServiceLoaderString getName()

そのクラスをテストするために、2 番目のプロジェクト ( my.runtime.test、Fragment-Host で設定my.runtime) に JUnit テストを用意し、プロジェクトにあるダミーの実装 ( MyDummy、戻り"Dummy")によって返された名前が によって返さmy.runtime.testれたリストにあるかどうかを確認しMyClient.getAllFactoryNames()ます。これまでのところ、問題なく動作しています。

3 番目のプロジェクト ( my.extension、依存関係あり) には、返された名前を使用して挨拶のリスト ( ) を返すmy.runtimeクラス ( ) があります。MyHelloMyClient.getAllFactoryNames()"Hello "+name

繰り返しますが、これをテストするために、別の実装 ( 、名前として返される) を含むプロジェクト ( my.extension.testmy.extensionFragment-Hostとして) と、によって返されるグリーティングに が含まれているかどうかをチェックする JUnit テスト ケースがあります。MyClient はまだ実装のみを検出し、実装を検出しないため、このテストは失敗します。両方の実装には、ファイル内の一致するエントリが伴います。MyWorld"World""Hello World"MyHello.getGreetings()MyDummyMyWorldMETA-INF/services/my.runtime.MyFactoryInterface

現在、次のコードを使用して実装をロードしています。

ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
    for (MyFactoryInterface myFactory : myFactoryLoader) {

の 2 番目の引数として ClassLoader を提供できることはわかっていますがServiceLoader.load、すべてのプラグイン プロジェクトを認識しているクラスローダーを取得する方法がわかりません。何か提案はありますか? または、ServiceLoader はこの問題に適したツールではありませんか?

4

1 に答える 1

3

誰かが同じ問題に遭遇した場合: 2 番目のテストのServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader())inMyClientとin の組み合わせでうまくいきました。Thread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader());

于 2011-09-26T07:50:09.583 に答える