CLOVER🍀

That was when it all began.

Virgoで始めるOSGi

これから少しの間、Virgoを使ったOSGiの勉強をしていこうと思います。途中で心が折れたら、そこでやめるかもしれませんが(笑)。

以前、仕事の提案でApache Felixを使ったOSGiの調査をしたことがあるのですが、OSGiの敷居の高さに完全に置いていかれ、諦めたことがありました。まあ、腰を据えて調べる時間がなかったということもありますが。

んで、最近ちょっと事業部が変わってしまった上司から「Spring dm Serverって知らない?」という話を持ちかけられ、そこから個人的にOSGiを調べてみようかなぁという気になっています。なお、該当するプロダクトにはSpring dmとSpring dm Serverがあるのですが、両者共にEclipseに移管されており、今では以下のように名前が変わっています。

Spring dm → Gemini
Spring dm Server → Virgo

双子座(Gemini)と乙女座(Virgo)ですかぁ。王道十二星座でも揃える気かね、Eclipse Runtimeは。

なお、OSGiランタイムの実装は、Equinoxっぽい?Equinoxとは、EclipseEclipse…というかプラグインの集合体として成立させているアレです。まあ、普通の開発者はその存在に直接お目にかかることはないかと思いますが。

ちなみに、まだSpring dm(Gemini)とSpring dm Server(Virgo)の境界はちゃんと理解してません…。OSGiからの依存関係を断ち切り、BundleをPOJOとして作成およびDIの支援をするのがSpring dmで、それを含めたWebアプリケーションサーバ込みのランタイム全体を提供するのがSpring dm Serverだと今は思っているのですが、どうなんでしょ…。

と、それはさておき、Virgoを使ったOSGiの基礎を学習しましょっかと。ついでにSpring 3.0の勉強もできたらいいなぁってことで。今のところ、自分のOSGiについてのイメージは、以下のような感じです。

  • アプリケーション(Bundle)を実行中に着脱できる、Javaでの汎用的な仕組み
  • Bundleのバージョン管理が可能で、同じBundleであってもバージョンが異なればそれは異なるものとして管理される
  • Bundleが依存するBundle(パッケージ)や公開するパッケージを決められるため、JARよりもアクセス制御が細やかにできる
  • Bundleの依存関係も、パッケージに加えてバージョンを指定して定義できる

というわけで、サービス稼働中であっても新しいバージョンと古いバージョンを同時に稼働させたり、任意に追加/停止ができ、かつアクセス制御、依存関係まで制御できる仕組みと捉えています。間違っていたらゴメンなさい…。

それでは、Virgoのドキュメントに沿ってチュートリアルを進めてみます。

Virgo Download
http://www.eclipse.org/virgo/download/

Creating an Application with Virgo
http://www.eclipse.org/virgo/documentation/virgo-documentation-2.1.1.RELEASE/docs/virgo-getting-started/html/index.html

チュートリアルを実行するために、
virgo-web-server-2.1.1.RELEASE.zip
greenpages-2.3.0.RELEASE.zip
をダウンロード。適当な場所でunzipして置いてください。

チュートリアルによると、環境変数「VWS_HOME」を設定するらしいです。

export VWS_HOME=/path/to/virgo-web-server-2.1.1.RELEASE

続いて、Virgo Web Serverを起動して確認。起動は「startup.sh」で。中身はTomcatよん。

cd $VWS_HOME/bin/ 
$ ./startup.sh 
[2011-05-23 20:33:13.149] startup-tracker              <KE0001I> Kernel starting. 
[2011-05-23 20:33:20.161] service-monitor-thread-1     <KE0100W> Reference '&objectNameCreator' in bundle 'org.eclipse.virgo.kernel.shell' version '2.1.1.RELEASE' is waiting for service with filter '(objectClass=org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator)'. 
[2011-05-23 20:33:20.260] Thread-3                     <KE0101I> Reference '&objectNameCreator' in bundle 'org.eclipse.virgo.kernel.shell' version '2.1.1.RELEASE' was satisfied by service with filter '(objectClass=org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator)'. 
[2011-05-23 20:33:20.875] startup-tracker              <KE0002I> Kernel started. 
[2011-05-23 20:33:21.013] system-artifacts             <DE0000I> Installing plan 'org.eclipse.virgo.kernel.userregion.springdm' version '2.1.1'. 
… Bundleのロードがひたすら続く …
[2011-05-23 20:33:30.360] Thread-3                     <WE0001I> Started web bundle 'org.eclipse.virgo.apps.admin.web' version '2.1.1.RELEASE' with context path '/admin'. 
[2011-05-23 20:33:30.372] start-signalling-2           <DE0005I> Started bundle 'org.eclipse.virgo.apps.admin.web' version '2.1.1.RELEASE'. 
[2011-05-23 20:33:30.377] start-signalling-2           <DE0005I> Started plan 'org.eclipse.virgo.apps.admin.plan' version '2.1.1'. 
[2011-05-23 20:33:30.569] Thread-3                     <WE0001I> Started web bundle 'org.eclipse.virgo.apps.splash' version '2.1.1.RELEASE' with context path '/'. 
[2011-05-23 20:33:30.574] start-signalling-1           <DE0005I> Started bundle 'org.eclipse.virgo.apps.splash' version '2.1.1.RELEASE'. 
[2011-05-23 20:33:31.142] Thread-3                     <WE0001I> Started web bundle 'org.eclipse.virgo.apps.repository-2.1.1.RELEASE-org.eclipse.virgo.apps.repository.web' version '2.1.1.RELEASE' with context path '/org.eclipse.virgo.apps.repository'. 
[2011-05-23 20:33:31.144] start-signalling-3           <DE0005I> Started bundle 'org.eclipse.virgo.apps.repository-2.1.1.RELEASE-org.eclipse.virgo.apps.repository.web' version '2.1.1.RELEASE'. 
[2011-05-23 20:33:31.148] start-signalling-3           <DE0005I> Started par 'org.eclipse.virgo.apps.repository' version '2.1.1.RELEASE'. 

と、しばらく待ってもここで止まっているので、ブラウザからアクセスしてみましょう。
http://localhost:8080/ でアクセスして、以下のようなスプラッシュが出れば成功です。

Welcomeの下、もしくは画面右上にある「Admin Console」リンクをクリックすると、Virgoの管理画面が表れます。

Admin Consoleのユーザ/パスワードのデフォルトは、これね。
ID: admin
Password: springsource

管理画面の「Artifacts」タブからは、現在インストールされているArtifactが、OSGi StateタブからはインストールされているOSGi Bundleの状態が確認できるっぽいです。

まだArtifactの位置付けがよくわかってません…。

続いて、サンプルアプリケーション「GreenPages」を突っ込んでみましょう。ああ、ビルドにはMavenがいるので、先にインストールしておいてくださいね。

GreenPagesインストール手順
http://www.eclipse.org/virgo/documentation/virgo-documentation-2.1.1.RELEASE/docs/virgo-getting-started/html/ch03s03.html

とりあえず、先に起動したVirgo Web Serverは止めておきます。Ctrl-Cで止めました(笑)。

[2011-05-23 20:52:44.044] System Bundle Shutdown       <KE0010I> Shutdown initiated. 

手順に従い、環境変数「GREENPAGES_HOME」を設定。…この環境変数、要るのかなぁ?

export GREENPAGES_HOME=/path/to/greenpages-2.3.0.RELEASE

続いて、solutionディレクトリに移動し「mvn package」を実行。
注意!初回は膨大なファイルをダウンロードしてくるため、時間がかかります。自分は10分以上かかりました…

$ cd $GREENPAGES_HOME/solution 
$ mvn package
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.springsource.dmserver:greenpages.parent-solution:pom:2.3.0.RELEASE
… 省略 …
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building GreenPages App Build 2.3.0.RELEASE
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] greenpages.parent ................................. SUCCESS [0.880s]
[INFO] greenpages.db ..................................... SUCCESS [1.954s]
[INFO] greenpages.app .................................... SUCCESS [0.632s]
[INFO] greenpages.jpa .................................... SUCCESS [13.229s]
[INFO] greenpages.web .................................... SUCCESS [14.370s]
[INFO] GreenPages PAR .................................... SUCCESS [1.432s]
[INFO] GreenPages App Build .............................. SUCCESS [0.001s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32.770s
[INFO] Finished at: Mon May 23 20:56:45 JST 2011
[INFO] Final Memory: 31M/297M
[INFO] ------------------------------------------------------------------------

完了!

続いて、依存ライブラリをVirgo Web Serverに放りこみます。

$ cd $GREENPAGES_HOME/solution/greenpages 
$ cp target/par-provided/* $VWS_HOME/repository/usr

サンプルアプリケーションが利用する、データベース(H2)の起動およびデータ登録。

$ cd $GREENPAGES_HOME/db 
$ sh run.sh &
[1] 10018
$ TCP server running on tcp://localhost:9092 (only local connections)
PG server running on pg://localhost:5435 (only local connections)
Web server running on http://localhost:8082 (only local connections)

$ sh data.sh 

最後に、ビルドでできあがったPARファイルをVirgo Web Serverに放りこみます。

$ cd $VWS_HOME 
$ cp $GREENPAGES_HOME/solution/greenpages/target/greenpages-solution-2.3.0.RELEASE.par pickup/

Virgo Web Serverを起動。

$ $VWS_HOME/bin/startup.sh -clean 
[2011-05-23 21:05:21.493] startup-tracker              <KE0001I> Kernel starting. 
[2011-05-23 21:05:27.602] service-monitor-thread-1     <KE0100W> Reference '&runtimeArtifactModel' in bundle 'org.eclipse.virgo.kernel.model' version '2.1.1.RELEASE' is waiting for service with filter '(objectClass=org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel)'. 
[2011-05-23 21:05:27.741] Thread-3                     <KE0101I> Reference '&applicationDeployer' in bundle 'org.eclipse.virgo.kernel.model' version '2.1.1.RELEASE' was satisfied by service with filter '(objectClass=org.eclipse.virgo.kernel.deployer.core.ApplicationDeployer)'. 
… 省略 …
[2011-05-23 21:05:41.661] start-signalling-2           <DE0005I> Started bundle 'org.eclipse.virgo.apps.splash' version '2.1.1.RELEASE'. 
[2011-05-23 21:05:42.397] Thread-3                     <WE0001I> Started web bundle 'greenpages-2.3.0.RELEASE-greenpages.web' version '2.3.0' with context path '/greenpages'. 
[2011-05-23 21:05:42.401] start-signalling-1           <DE0005I> Started bundle 'greenpages-2.3.0.RELEASE-greenpages.web' version '2.3.0'. 
[2011-05-23 21:05:42.514] start-signalling-1           <DE0005I> Started bundle 'greenpages-2.3.0.RELEASE-greenpages.jpa' version '2.3.0'. 
[2011-05-23 21:05:42.520] start-signalling-1           <DE0005I> Started par 'greenpages' version '2.3.0.RELEASE'. 

GreenPagesが入ったっぽいです。

それでは、以下のURLへアクセス。
http://localhost:8080/greenpages/

以下の画面が出れば成功です。
※テキストフィールドの「on」は自分で入力しています。

「on」を入れたままsubmitすると、一応検索結果っぽいものが表れます。

まずはここまで。