osgiバンドルではないjarファイルがあります。それをstarter.jarと呼ぶことにしよう。そして私はこの方法でこのスターターを実行します:java -jar starter.jar。このスターターはfelixフレームワークを開始します:OSGI:systemBundle経由でosgiコンテナの外部でサービスを使用
Felix felix = new Felix(configMap);
systemBundle=felix.getBundle();
その後、いくつかのサービスをエクスポートするosgiバンドルをインストールして起動します。
スターターはosgiコンテナーの外にありますが、systemBundleへの参照があります。 starter.jarでいくつかのosgiサービスを使用することは可能であり、通常の(安全な)ものですか?
EDIT今 私は(starter.jarからコード)ソリューションを働いてきたので、これが可能であることを知っている:
BundleContext bundleContext=systemBundle.getBundleContext();
ServiceReference reference = bundleContext.getServiceReference(Temp.class.getName());
Object server = (Object) bundleContext.getService(reference);
Method method = server.getClass().getMethod("getString");
Object result=method.invoke(server);
私は異なるためクラスローダのにClassCastExceptionsを得たように私は、リフレクションを使用していました。そして、最終的な解決策はかなり醜いです。たぶん誰かがより良い方法を提供するでしょう。または、ネットワークソケット経由以外の方法はありませんか?
サービスインタフェースを含むパッケージを、組み込みOSGiコンテナのシステムパッケージに追加できます。その場合、あなたは反映せずにサービスを使用することができます。 –
@Balazs Zsoldos私はお試しになります。とても良いアイデアだと思う。 –