この記事では、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()>
すると、デスクトップに次のような画面が現れます。
続いて、次のように実行し、円を描く機能をインストールします。
karaf@root()> install -s mvn:org.apache.felix.example/servicebased.circle/1.0.0/jar
Bundle ID: 65
すると、画面が次のようになります。
ここで、円のアイコンを押して白地のキャンバスをクリックすると、そのキャンバスに次のような円が描かれます。
ここで、円を描く機能をアンインストールしてみます。
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()>
すると画面は次のようになります。
そして、ここで、もう一度インストールすると、元に戻ります。
karaf@root()> install -s mvn:org.apache.felix.example/servicebased.circle/1.0.0/jar
Bundle ID: 66
では、他の機能も全部インストールしてみます。
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
すると、次のような画面になります。
このアプリケーションを終了するには、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
うまく、アプリケーションが表示されたでしょうか。
個人的には、こういう仕組みは、かなり好きです。(^^;
この記事の続きがあります。こちらです。