Apache Felix の servicebased サンプルを Apache Karaf で動作させる – デスクトップアプリケーションの OSGi によるモジュール化(1/2)

この記事では、Felix の servicebased サンプルを Karaf で動作させるための手順を紹介します。

servicebased サンプルは、デスクトップアプリケーションの OSGi によるモジュール化の一例となっています。

この記事では、Java8 と Apache Karaf3.0.3, Apache Felix 4.0.2 を使っています。

● Felix の servicebased サンプルをローカルの Maven リポジトリにインストール

まず、適当なディレクトリに、Felix の trunk にあるソースをチェックアウトします1)サンプルの pom.xml がプロジェクト単位で閉じていないため

次のように実行します。

$ svn checkout http://svn.apache.org/repos/asf/felix/trunk/

チェックアウトしたディレクトリの examples ディレクトリの下にある、次の5つの Maven プロジェクトが、この記事で使用するプロジェクトになります。

servicebased.host
servicebased.circle
servicebased.square
servicebased.trapezoid
servicebased.triangle

servicebased.host は、アプリケーション本体で、それ以外は機能です。
本体と、円や四角などを描く機能がそれぞれ異なる Bundle (=OSGiベースのモジュール)として実装されているイメージになります。

では、まずインストールする前に、pom.xml を修正しておきます。
servicebased サンプルで指定されている Felix はかなり古いため、最新の Karaf で動作しないためです。

次のように、最新の Karaf で動作するように、その指定を修正します。

examples/servicebased.host/pom.xmlを開き:

    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.framework</artifactId>
      <version>4.0.2</version>
    </dependency>

の箇所を次のように修正します。

    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.framework</artifactId>
      <version>4.4.1</version>
    </dependency>

修正を終えたら、servicebased.host プロジェクトをビルドし、Bundle としてローカルの Maven リポジトリにインストールします。

$ cd examples/servicebased.host
$ mvn install

servicebased.host Bundle をインストールを終えたら、残りの4つの Bundle プロジェクトもすべて同様にビルドしインストールしておきます。

一つ例を挙げると、このような感じになります。

$ cd examples/servicebased.circle
$ mvn install

これを残り3つのプロジェクトでも行います。

● Karaf のダウンロード

Karaf をダウンロードして展開します。

Unix 系だと次のような手順となります。

$ wget http://ftp.riken.jp/net/apache/karaf/3.0.3/apache-karaf-3.0.3.tar.gz
$ tar zxvf apache-karaf-3.0.3.tar.gz

※ Karaf 4.0.0.M1 でも動作することを確認しています。

● servicebased の Bundle を Karaf にインストール

展開できたら、Karaf を起動します。

$ cd apache-karaf-3.0.3/bin
$ ./karaf
        __ __                  ____
       / //_/____ __________ _/ __/
      / ,<  / __ `/ ___/ __ `/ /_
     / /| |/ /_/ / /  / /_/ / __/
    /_/ |_|\__,_/_/   \__,_/_/

  Apache Karaf (3.0.3)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()>

起動できたら、ホストとなる Bundle をインストールし起動してみます2)もし、ローカルリポジトリの設定を変更していて、Karafがそれを見つけることができない場合は、Karafのetc/org.ops4j.pax.url.mvn.cfgファイルに、そのリポジトリの設定を加えてください。

install の -s オプションは、インストールだけでなく起動も試みることを指示するオプションです。

karaf@root()> install -s mvn:org.apache.felix.example/servicebased.host/1.0.0/jar
Bundle ID: 64
karaf@root()>

すると、デスクトップに次のような画面が現れます。

host

続いて、次のように実行し、円を描く機能をインストールします。

karaf@root()> install -s mvn:org.apache.felix.example/servicebased.circle/1.0.0/jar
Bundle ID: 65

すると、画面が次のようになります。

circle

ここで、円のアイコンを押して白地のキャンバスをクリックすると、そのキャンバスに次のような円が描かれます。

circle-3

ここで、円を描く機能をアンインストールしてみます。

karaf@root()> list
START LEVEL 100 , List Threshold: 50
ID | State  | Lvl | Version | Name
-------------------------------------------------------------
64 | Active |  80 | 1.0.0   | Apache Felix Service-Based Host
65 | Active |  80 | 1.0.0   | Apache Felix Circle Service
karaf@root()> uninstall 65
karaf@root()>

すると画面は次のようになります。

circle-uninstall

そして、ここで、もう一度インストールすると、元に戻ります。

karaf@root()> install -s mvn:org.apache.felix.example/servicebased.circle/1.0.0/jar
Bundle ID: 66
circle-3

では、他の機能も全部インストールしてみます。

karaf@root()> install -s mvn:org.apache.felix.example/servicebased.square/1.0.0/jar
Bundle ID: 67
karaf@root()> install -s mvn:org.apache.felix.example/servicebased.trapezoid/1.0.0/jar
Bundle ID: 68
karaf@root()> install -s mvn:org.apache.felix.example/servicebased.triangle/1.0.0/jar
Bundle ID: 69

すると、次のような画面になります。

all-functions

このアプリケーションを終了するには、Karaf のコンソールで logout を実行するか、servicebased アプリケーションを終了します。

● Felix の環境だけで動作させる

ついでに、Felix の公式サイトの中のこのサンプルを紹介しているページで解説されているように、Felix の環境だけで動作させてみましょう。

そのためには、各プロジェクトに対して mvn install を実行した際に、生成された target ディレクトリの中にある jar ファイルを適当なディレクトリにコピーします。

次のようなイメージになります。
※ここでは servicebased というディレクトリを作成し、そこに生成した jar ファイルを集めています。

$ mkdir servicebased
$ cd servicebased
$ cp ../examples/servicebased.host/target/servicebased.host-1.0.0.jar .
$ cp ../examples/servicebased.host/target/servicebased.circle-1.0.0.jar .
$ cp ../examples/servicebased.host/target/servicebased.square-1.0.0.jar .
$ cp ../examples/servicebased.host/target/servicebased.trapezoid-1.0.0.jar .
$ cp ../examples/servicebased.host/target/servicebased.triangle-1.0.0.jar .
$ ls
servicebased.host-1.0.0.jar
servicebased.circle-1.0.0.jar
servicebased.square-1.0.0.jar
servicebased.trapezoid-1.0.0.jar
servicebased.triangle-1.0.0.jar
$

次の様にして起動できます。

$ java -jar servicebased.host-1.0.0.jar file:servicebased.circle-1.0.0.jar file:servicebased.square-1.0.0.jar file:servicebased.triangle-1.0.0.jar file:servicebased.trapezoid-1.0.0.jar

うまく、アプリケーションが表示されたでしょうか。

個人的には、こういう仕組みは、かなり好きです。(^^;


この記事の続きがあります。こちらです。

Footnotes

Footnotes
1 サンプルの pom.xml がプロジェクト単位で閉じていないため
2 もし、ローカルリポジトリの設定を変更していて、Karafがそれを見つけることができない場合は、Karafのetc/org.ops4j.pax.url.mvn.cfgファイルに、そのリポジトリの設定を加えてください。