私は OSGI テクノロジを実際に使用したばかりで、基本的なクエリはほとんどありません。これが私がやったことです:
「com.mypackage.osgi.bundle.service」というパッケージに HelloWorld インターフェイスを作成しました。このインターフェイスはメソッドを次のように公開します。 public String sayHello(String arg);
「com.mypackage.osgi.bundle.service.impl」というパッケージに HelloWorldImpl クラスを作成しました。このクラスは HelloWorld インターフェイスを実装し、sayHello() メソッドの実装を提供します。
「com.mypackage.osgi.bundle.activator」というパッケージに HelloWorldActivator クラスを作成しました。このクラスは、BundleActivator インターフェイスを実装し、インターフェイスの start() および stop() メソッドを実装します。
start() メソッドでは、「BundleContext」を介してこのバンドルをサービスとして登録しています。コードは次のとおりです。
public class HelloWorldActivator は BundleActivator を実装します {
ServiceRegistration helloServiceRegistration; public void start(BundleContext context) throws Exception { HelloWorld helloService = new HelloWorldImpl(); helloServiceRegistration =context.registerService(HelloWorld.class.getName(), helloService, null); System.out.println("Service registered"); } public void stop(BundleContext context) throws Exception { helloServiceRegistration.unregister(); System.out.println("Service un-registered"); } }
次に、このプロジェクトを maven プラグインを使用して OSGI バンドルとしてパッケージ化し、OSGI コンテナー (Equinox) にデプロイします。手順では、インターフェイスを export-package として公開しました。OSGI バンドルが OSGI コンテナーにサービスとして正常にデプロイされていることがわかります (バンドル ID は ACTIVE 状態を示し、osgi コンソールで「サービスが登録されました」という出力も確認できます)。
次のステップは、上記の OSGI バンドルをサービスとして使用することです。これを行うために、「ServiceReference」を使用できることを理解しています。
上記で作成したサービスのコンシューマーとして機能するように、まったく新しい Java プロジェクトを作成しているとします(したがって、このプロジェクトのワークスペースには上記で作成したものとのリンクはありません)。
私の質問は - この新しい Java プロジェクトで HelloWorld インターフェイスの「コピー」を作成する必要がありますか? つまり、この新しいプロジェクトのワークスペースで、このインターフェイスを「スタブ」として持つ必要がありますか?
これを尋ねる理由は、新しいプロジェクトのワークスペースに「HelloWorld」インターフェイスのコピーがない場合、下記の 2 行目と 3 行目でコンパイル エラーが発生するためです。
public class ConsumerActivator は BundleActivator を実装します {
ServiceReference helloServiceReference; public void start(BundleContext context) throws Exception { helloServiceReference= context.getServiceReference(HelloWorld.class.getName()); //2 HelloWorld helloService =(HelloWorld)context.getService(helloServiceReference); //3 System.out.println(helloService.sayHello("Test user")); } public void stop(BundleContext context) throws Exception { context.ungetService(helloServiceReference); } }
では、コンシューマ バンドルには、使用する予定のサービス インターフェイスの「スタブ」が必要であると言うのは正しいでしょうか?
非常に基本的な質問に聞こえる場合は申し訳ありませんが、ネット上のどこにも言及が見つからなかったため、明確にする必要があります。提供されるすべての例では、コンシューマーとサービスの両方が同じコード ワークスペースの一部であることを前提としています。
明確にするために事前に感謝します。
よろしくLB