私のワークスペースには 4 つの Eclipse プラグイン プロジェクトがあります (新しい Java プロジェクトを作成し、右クリックして構成し、プラグイン プロジェクトに変換します)。最初の ( my.runtime
) には、インターフェース ( ) と、そのインターフェースのすべての実装をロードしてメソッド ( )を呼び出し、結果を収集してリストに返すメソッド ( ) を定義するMyFactoryInterface
クラス ( ) が含まれています。MyClient
List<String> getAllFactoryNames()
java.util.ServiceLoader
String getName()
そのクラスをテストするために、2 番目のプロジェクト ( my.runtime.test
、Fragment-Host で設定my.runtime
) に JUnit テストを用意し、プロジェクトにあるダミーの実装 ( MyDummy
、戻り"Dummy"
)によって返された名前が によって返さmy.runtime.test
れたリストにあるかどうかを確認しMyClient.getAllFactoryNames()
ます。これまでのところ、問題なく動作しています。
3 番目のプロジェクト ( my.extension
、依存関係あり) には、返された名前を使用して挨拶のリスト ( ) を返すmy.runtime
クラス ( ) があります。MyHello
MyClient.getAllFactoryNames()
"Hello "+name
繰り返しますが、これをテストするために、別の実装 ( 、名前として返される) を含むプロジェクト ( my.extension.test
、my.extension
Fragment-Hostとして) と、によって返されるグリーティングに が含まれているかどうかをチェックする JUnit テスト ケースがあります。MyClient はまだ実装のみを検出し、実装を検出しないため、このテストは失敗します。両方の実装には、ファイル内の一致するエントリが伴います。MyWorld
"World"
"Hello World"
MyHello.getGreetings()
MyDummy
MyWorld
META-INF/services/my.runtime.MyFactoryInterface
現在、次のコードを使用して実装をロードしています。
ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
for (MyFactoryInterface myFactory : myFactoryLoader) {
の 2 番目の引数として ClassLoader を提供できることはわかっていますがServiceLoader.load
、すべてのプラグイン プロジェクトを認識しているクラスローダーを取得する方法がわかりません。何か提案はありますか? または、ServiceLoader はこの問題に適したツールではありませんか?