わかった。したがって、次の方法でプログラムで作成した org.osgi.framework.launch.Framework があります。
framework = ServiceLoader.load(FrameworkFactory.class).iterator().next().newFramework(getFrameworkConfig());
framework.start();
installBundles(BUNDLES_PATH); // installs bundles from a directory, by searching BUNDLES_PATH recursively for JARs
私がやりたいことは、インストールされたバンドルをスキャンし、それらの Export-Package: 宣言を読み取り、クラスの packageName に基づいて正しいバンドルの loadClass メソッドを呼び出すユニバーサル loadClass メソッドを (このクラスのメソッドとして) 持つことです。パラメーターとして渡しています。
これを行うスマートな方法はありますか?または、これを行う方が良いですか:
Class<?> c = null;
// else try every installed bundle one-by-one
for (Bundle bundle : framework.getBundleContext().getBundles()) {
try {
c = bundle.loadClass(className);
} catch (ClassNotFoundException e) {
// OK, move onto next bundle
continue;
}
if (c != null)
break;
}
return c;
サービスを使用して、バンドルに利用可能なサービスを公開させ、フレームワークに getAllServiceReferences() を使用してサービスをクエリさせることができますが、これはプログラマーにとってより多くの作業であり、宣言型サービスのルートに行きたいかどうかはわかりません。