12.5. OSGi サービスへのアクセス
12.5.1. 概要
このセクションでは、OSGi コンテナーで単純な OSGi クライアントの生成、構築、およびデプロイ方法について説明します。クライアントは、OSGi レジストリーで単純な Hello World サービスを見つけ、そのサービスで sayHello()
メソッドを呼び出します。
12.5.2. 前提条件
Maven クイックスタートアーキタイプを使用してプロジェクトを生成するには、次の前提条件を満たす必要があります。
- Maven インストール: Maven は Apache の無料のオープンソースビルドツールです。最新バージョンは http://maven.apache.org/download.html からダウンロードできます (最小値は 2.0.9 です)。
- インターネット接続: ビルドの実行中、Maven は追加設定を必要とせずに動的に外部リポジトリーを検索し、必要なアーティファクトをダウンロードします。これを機能させるには、ビルドマシンがインターネットに接続されている 必要 があります。
12.5.3. Maven プロジェクトの生成
maven-archetype-quickstart
アーキタイプは汎用の Maven プロジェクトを作成し、それを目的に合わせてカスタマイズできます。コーディネート org.fusesource.example:osgi-client
を使用して Maven プロジェクトを生成するには、次のコマンドを入力します。
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-client
このコマンドの結果は、生成されたプロジェクトのファイルを含むディレクトリー ProjectDir/osgi-client
です。
既存の製品のグループ ID と競合するアーティファクトのグループ ID を 選択しない ように 注意 してください。これにより、プロジェクトのパッケージと既存の製品のパッケージが競合する可能性があります (通常、グループ ID はプロジェクトの Java パッケージ名のルートとして使用されるため)。
12.5.4. POM ファイルのカスタマイズ
OSGi バンドルを生成するには、次のように POM ファイルをカスタマイズする必要があります。
- 「バンドルプロジェクトの生成」 で説明されている POM のカスタマイズ手順に従います。
クライアントは
osgi-service
バンドルで定義されるHelloWorldSvc
Java インターフェイスを使用するため、osgi-service
バンドルに Maven 依存関係を追加する必要があります。osgi-service
バンドルの Maven コーディネートがorg.fusesource.example:osgi-service:1.0-SNAPSHOT
であることを想定する場合、以下の依存関係をクライアントの POM ファイルに追加する必要があります。<project ... > ... <dependencies> ... <dependency> <groupId>org.fusesource.example</groupId> <artifactId>osgi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ... </project>
12.5.5. Blueprint ファイルの書き込み
Blueprint ファイルをクライアントプロジェクトに追加するには、最初に次のサブディレクトリーを作成します。
ProjectDir/osgi-client/src/main/resources ProjectDir/osgi-client/src/main/resources/OSGI-INF ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
ディレクトリーの下で、お気に入りのテキストエディターを使用して config.xml
ファイルを作成し、例12.6「サービスをインポートするための Blueprint ファイル」から XML コードを追加します。
例12.6 サービスをインポートするための Blueprint ファイル
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="helloWorld" interface="org.fusesource.example.service.HelloWorldSvc"/> <bean id="client" class="org.fusesource.example.client.Client" init-method="init"> <property name="helloWorldSvc" ref="helloWorld"/> </bean> </blueprint>
reference
要素は、OSGi レジストリーで HelloWorldSvc
タイプのサービスを見つける参照マネージャーを作成します。bean
要素は Client
クラスのインスタンスを作成し、サービス参照を Bean プロパティー helloWorldSvc
として注入します。さらに、init-method
属性は、Bean の初期化フェーズ中 (つまり、サービス参照がクライアント Bean に注入された後) に Client.init()
メソッドが呼び出されるように指定します。
12.5.6. クライアントクラスの作成
ProjectDir/osgi-client/src/main/java/org/fusesource/example/client
ディレクトリーの下で、お気に入りのテキストエディターを使用して Client.java
ファイルを作成し、例12.7「クライアントクラス」から Java コードを追加します。
例12.7 クライアントクラス
package org.fusesource.example.client; import org.fusesource.example.service.HelloWorldSvc; public class Client { HelloWorldSvc helloWorldSvc; // Bean properties public HelloWorldSvc getHelloWorldSvc() { return helloWorldSvc; } public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) { this.helloWorldSvc = helloWorldSvc; } public void init() { System.out.println("OSGi client started."); if (helloWorldSvc != null) { System.out.println("Calling sayHello()"); helloWorldSvc.sayHello(); // Invoke the OSGi service! } } }
Client
クラスは helloWorldSvc
Bean プロパティーの getter メソッドおよび setter メソッドを定義します。これによりインジェクションによる Hello World サービスへの参照を受け取ることができます。init()
メソッドは、プロパティーインジェクションの後に Bean 初期化フェーズ中に呼び出されます。つまり、通常、このメソッドのスコープ内で Hello World サービスを呼び出すことができます。
12.5.7. クライアントバンドルの実行
osgi-client
プロジェクトをインストールおよび実行するには、以下の手順を実行します。
プロジェクトをビルドします — コマンドプロンプトを開き、
ProjectDir/osgi-client
ディレクトリーに移動します。Maven を使用して、次のコマンドを入力してデモをビルドします。mvn install
このコマンドが正常に実行される場合、
ProjectDir/osgi-client/target
ディレクトリーには、バンドルファイルosgi-client-1.0-SNAPSHOT.jar
が含まれている必要があります。osgi-service バンドルをインストールして開始する: Red Hat Fuse コンソールで、次のコマンドを入力します。
karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
ProjectDir は Maven プロジェクトを含むディレクトリーで、
-s
フラグはバンドルをすぐに起動するように指示します。たとえば、Windows マシンのプロジェクトディレクトリーがC:\Projects
の場合、以下のコマンドを入力します。karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
注記Windows マシンでは、
file
URL のフォーマット方法に注意してください。file
URL ハンドラーが認識する構文の詳細は 「ファイル URL ハンドラー」 を参照してください。クライアント出力: クライアントバンドルが正常に開始されると、コンソールに次のような出力がすぐに表示されます。
Bundle ID: 239 OSGi client started. Calling sayHello() Hello World!