12.4. OSGi サービスの公開

12.4.1. 概要

このセクションでは、OSGi コンテナーで単純な OSGi サービスの生成、構築、およびデプロイ方法について説明します。このサービスは単純な HelloWorldJava クラスであり、OSGi 設定は Blueprint 設定ファイルを使用して定義されます。

12.4.2. 前提条件

Maven クイックスタートアーキタイプを使用してプロジェクトを生成するには、次の前提条件を満たす必要があります。

  • Maven インストール: Maven は Apache の無料のオープンソースビルドツールです。最新バージョンは http://maven.apache.org/download.html からダウンロードできます (最小値は 2.0.9 です)。
  • インターネット接続: ビルドの実行中、Maven は追加設定を必要とせずに動的に外部リポジトリーを検索し、必要なアーティファクトをダウンロードします。これを機能させるには、ビルドマシンがインターネットに接続されている 必要 があります。

12.4.3. Maven プロジェクトの生成

maven-archetype-quickstart アーキタイプは汎用の Maven プロジェクトを作成し、それを目的に合わせてカスタマイズできます。コーディネート org.fusesource.example:osgi-service を使用して Maven プロジェクトを生成するには、次のコマンドを入力します。

mvn archetype:create
-DarchetypeArtifactId=maven-archetype-quickstart
-DgroupId=org.fusesource.example
-DartifactId=osgi-service

このコマンドの結果は、生成されたプロジェクトのファイルを含むディレクトリー ProjectDir/osgi-service です。

注記

既存の製品のグループ ID と競合するアーティファクトのグループ ID を 選択しない ように 注意 してください。これにより、プロジェクトのパッケージと既存の製品のパッケージが競合する可能性があります (通常、グループ ID はプロジェクトの Java パッケージ名のルートとして使用されるため)。

12.4.4. POM ファイルのカスタマイズ

OSGi バンドルを生成するには、次のように POM ファイルをカスタマイズする必要があります。

  1. 「バンドルプロジェクトの生成」 で説明されている POM のカスタマイズ手順に従います。
  2. Maven バンドルプラグインの設定で、以下のようにバンドルの手順を変更して org.fusesource.example.service パッケージをエクスポートします。

    <project ... >
      ...
      <build>
        ...
        <plugins>
          ...
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
              <instructions>
                <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
            <Export-Package>org.fusesource.example.service</Export-Package>
              </instructions>
            </configuration>
          </plugin>
        </plugins>
      </build>
      ...
    </project>

12.4.5. サービスインターフェイスの作成

ProjectDir/osgi-service/src/main/java/org/fusesource/example/service サブディレクトリーを作成します。このディレクトリーで、お気に入りのテキストエディターを使用してファイル HelloWorldSvc.java を作成し、例12.3「HelloWorldSvc インターフェイス」 からコードを追加します。

例12.3 HelloWorldSvc インターフェイス

package org.fusesource.example.service;

public interface HelloWorldSvc
{
    public void sayHello();
}

12.4.6. サービスクラスの作成

ProjectDir/osgi-service/src/main/java/org/fusesource/example/service/impl サブディレクトリーを作成します。このディレクトリーで、お気に入りのテキストエディターを使用してファイル HelloWorldSvcImpl.java を作成し、例12.4「HelloWorldSvcImpl クラス」 からコードを追加します。

例12.4 HelloWorldSvcImpl クラス

package org.fusesource.example.service.impl;

import org.fusesource.example.service.HelloWorldSvc;

public class HelloWorldSvcImpl implements HelloWorldSvc {

    public void sayHello()
    {
        System.out.println( "Hello World!" );
    }

}

12.4.7. Blueprint ファイルの書き込み

Blueprint 設定ファイルは、クラスパスの OSGI-INF/blueprint ディレクトリーに格納されている XML ファイルです。Blueprint ファイルをプロジェクトに追加するには、最初に次のサブディレクトリーを作成します。

ProjectDir/osgi-service/src/main/resources
ProjectDir/osgi-service/src/main/resources/OSGI-INF
ProjectDir/osgi-service/src/main/resources/OSGI-INF/blueprint

src/main/resources は、すべての JAR リソースの標準的な Maven の場所になります。このディレクトリーの下のリソースファイルは、生成されたバンドル JAR のルートスコープに自動的にパッケージ化されます。

例12.5「サービスをエクスポートするための Blueprint ファイル」 は、bean 要素を使用して、HelloWorldSvc Bean を作成し、service 要素を使用して Bean を OSGi サービスとしてエクスポートする Blueprint ファイルのサンプルを示しています。

ProjectDir/osgi-service/src/main/resources/OSGI-INF/blueprint ディレクトリーの下で、お気に入りのテキストエディターを使用して config.xml ファイルを作成し、例12.5「サービスをエクスポートするための Blueprint ファイル」から XML コードを追加します。

例12.5 サービスをエクスポートするための Blueprint ファイル

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <bean id="hello" class="org.fusesource.example.service.impl.HelloWorldSvcImpl"/>

  <service ref="hello" interface="org.fusesource.example.service.HelloWorldSvc"/>

</blueprint>

12.4.8. サービスバンドルの実行

osgi-service プロジェクトをインストールおよび実行するには、以下の手順を実行します。

  1. プロジェクトをビルドします — コマンドプロンプトを開き、ProjectDir/osgi-service ディレクトリーに移動します。Maven を使用して、次のコマンドを入力してデモをビルドします。

    mvn install

    このコマンドが正常に実行される場合、ProjectDir/osgi-service/target ディレクトリーには、バンドルファイル osgi-service-1.0-SNAPSHOT.jar が含まれている必要があります。

  2. osgi-service バンドルをインストールして開始する: Red Hat Fuse コンソールで、次のコマンドを入力します。

    Jkaraf@root()> bundle:install -s file:ProjectDir/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar

    ProjectDir は Maven プロジェクトを含むディレクトリーで、-s フラグはバンドルをすぐに起動するように指示します。たとえば、Windows マシンのプロジェクトディレクトリーが C:\Projects の場合、以下のコマンドを入力します。

    karaf@root()> bundle:install -s file:C:/Projects/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
    注記

    Windows マシンでは、file URL のフォーマット方法に注意してください。file URL ハンドラーが認識する構文の詳細は 「ファイル URL ハンドラー」 を参照してください。

  3. サービスが作成されたことを確認する: バンドルが正常に開始されたことを確認するには、次の Red Hat Fuse コンソールコマンドを入力します。

    karaf@root()> bundle:list

    このリストのどこかに、osgi-service バンドルの行が表示されるはずです。以下に例を示します。

    [ 236] [Active     ] [Created     ] [       ] [   60] osgi-service (1.0.0.SNAPSHOT)