2016-07-23 6 views
-1

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を得たように私は、リフレクションを使用していました。そして、最終的な解決策はかなり醜いです。たぶん誰かがより良い方法を提供するでしょう。または、ネットワークソケット経由以外の方法はありませんか?

+0

サービスインタフェースを含むパッケージを、組み込みOSGiコンテナのシステムパッケージに追加できます。その場合、あなたは反映せずにサービスを使用することができます。 –

+0

@Balazs Zsoldos私はお試しになります。とても良いアイデアだと思う。 –

答えて

1

適用する二つの重要なルールがあります:

  1. 同じ輸出からは両方は、APIパッケージをインポートしなければならないサービス(サービス・インターフェースを定義する、すなわちパッケージ)の提供者と消費者。これはいくつかの方法で整理することができます。プロバイダーとコンシューマーの両方が3番目のAPIバンドルからインポートするか、プロバイダーがパッケージとコンシューマーのインポートをエクスポートできます...(まれに)コンシューマーがパッケージをエクスポートでき、プロバイダーがそれをインポートします。

  2. システムバンドは、通常のバンドルからパッケージをインポートできません。それはエクスポートすることしかできません。

二番目のルールでは、システム・バンドルと通常の束の間のサービスと通信したい場合、APIパッケージは、システム・バンドルのクラスパス上に置き、org.osgi.framework.system.packages.extraを使用してエクスポートしなければならないことを意味しています。通常のバンドルでは、通常の方法でパッケージをインポートします。システムバンドルがサービスの提供者であるかサービス消費者であるかにかかわらず、この方法で行う必要があります。

関連する問題