【コラム】

Java API、使ってますか?

19 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入

 

19/60

JSR 291: Dynamic Component Support for Java SE

本連載では第12回の記事で、Javaプラットフォームにおけるモジュラリティをサポートする「JSR 277: Java Module System」について取り上げた。JCPにはJSR 277と同様にモジュラリティの強化を目指すAPIとして、「JSR 291: Dynamic Component Support for Java SE」がある。

JSR 291は、標準化団体OSGi Allianceによって提供されているダイナミックコンポーネントモデル仕様をベースとしたダイナミックコンポーネントフレームワークを、Java SE環境で利用できるようにしようというもの。OSGi仕様ではJavaプラットフォームにおけるアプリケーションのコンポーネント化やライフサイクル管理やサービスリポジトリなどをサポートする。標準のJava SEにはコンポーネントを動的にインストール/起動/停止/アンインストールするような機能は用意されていないが、JSR 291を利用すればそれが可能になる。

JSR 277とJSR 291はいずれもJavaプラットフォームのモジュラリティに関する機能を提供するものだが、前者の目的がJava SEに対して静的なモジュールシステムを追加することなのに対して、後者の目的はJavaプラットフォーム上で動的に着脱可能なコンポーネントシステムを提供することにある。したがってJSR 291は既存のJavaプラットフォームを対象としてデザインされているという点が、JSR 277の思想とは大きく異なっている。

それに加えて、JSR 291はOSGi R4というすでに十分に洗練された仕様をベースとしている。とくにレガシーアプリケーション開発に関してはOSGiの長所が生きてくる。また、Java MEを対象とした同様のフレームワークであるJSR 232との互換性が考慮されている点にも注目したい。

なお、JSR 277とJSR 291の違いについては、スペックリードであるGlyn Normington氏のブログにおいてより詳細に解説されている。

OSGiフレームワークを試す

JSR 291の参照実装は公開されていないが、OSGi仕様のフリーな実装としてはEclipseプロジェクトによって「Equinox」が公開されている。これはEclipseのプラグインの仕組みを提供するツールとして開発され、v3.0以降で利用されている。EquinoxはJSR 291の実装候補にもなっており、その実力を試すには十分な機能を提供してくれる。

Equinoxの最新版であるバージョン3.3はこのページより入手できる。フレームワーク単体は「Equinox OSGi R4 framework(以下、Equinox framework)」というもので、「org.eclipse.osgi_<バージョン番号>.jar」というファイルをダウンロードすればよい。その他、Eclipse本体にもEquinoxが付属している。

まず、簡単なOSGiバンドルを作成する。バンドルを作成するには、バンドルの起動や停止を行うorg.osgi.framework.BundleActivatorインタフェースをimplementsする。今回はリスト1のようにHelloActivatorクラスを作成した。起動時および停止時に実行される処理は、それぞれstat/stopメソッドに実装する。

リスト1 HelloActivator.java - 簡単なOSGiバンドルの例

package apisample;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class HelloActivator implements BundleActivator {
    public void start(BundleContext context) throws Exception {
        System.out.println("Start hello1!");
    }

    public void stop(BundleContext context) throws Exception {
        System.out.println("Stop hello1!");
    }
}

jarコマンドを用いて作成したバンドルはJAR形式にまとめる。本稿の例では「hello1.jar」というファイル名にした(プロンプト1)。マニフェストファイルはリスト2のようにした。"Bundle-*"というのはバンドルのための情報である。

プロンプト1 JARファイルの作成

% jar cfm hello1.jar Manifest.mf apisample lib

リスト2 Manifest.mf - マニフェストファイル

Manifest-Version: 1.0
Class-Path: lib/org.eclipse.osgi_3.3.0.v20070530.jar
Bundle-ManifestVersion: 2
Bundle-Name: Hello Plug-in
Bundle-SymbolicName: hello1
Bundle-Version: 1.0.0
Bundle-Activator: apisample.HelloActivator
Bundle-Localization: plugin
Import-Package: org.osgi.framework;version="1.3.0"

Equinox frameworkはjavaコマンドを用いてプロンプト2のように起動する。するとOSGiコンソールが立ち上がる。

プロンプト2 Equinox frameworkの起動

% java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console

osgi> 

OSGiコンソールでは次のようなコマンドでバンドルの管理などを行うことができる。たとえば「ss」と入力すれば、現在インストールされているすべてのバンドルの状態がプロンプト3のように表示される。その他の利用可能なコマンドについては、「?」と入力すればヘルプが表示される。

  • install <バンドルのURL> … 指定したURLからバンドルをインストールする
  • start <バンドル番号またはバンドル名> … 指定したバンドルを開始する
  • stop <バンドル番号またはバンドル名> … 指定したバンドルを停止する
  • ss … インストール済みのすべてのバンドルの状態を表示する

プロンプト3 すべてのインストール済みバンドルの状態を表示

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.3.0.v20070530

osgi> 

先ほど作成したバンドルをインストールするには、installコマンドを用いてプロンプト2.6のようにする。JARファイルの場所はURL形式で指定しなければならない。ssコマンドを使うと、新たに「hello1_1.0.0」というバンドルが追加されてステータス"INSTALLED"になっているのがわかる。

プロンプト4 バンドルのインストール

osgi> install file://[PATH_TO_BUNDOLE]/hello1.jar
Bundle id is 2

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.3.0.v20070530
2       INSTALLED   hello1_1.0.0

osgi> 

バンドルを開始するにはプロンプト5のようにする。開始時にはBundleActivatorのstart()メソッドが呼ばれ、ステータスは"ACTIVE"になる。

プロンプト5 バンドルの開始

osgi> start 2
Start hello1!

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.3.0.v20070530
2       ACTIVE      hello1_1.0.0

osgi> 

バンドルの停止はプロンプト6のように行う。停止時にはBundleActivatorのstop()メソッドが呼ばれ、ステータスは"RESOLVED"に変わる。

プロンプト6 バンドルの停止

osgi> stop 2
Stop hello1!

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.3.0.v20070530
2       RESOLVED    hello1_1.0.0

osgi> 

インストール済みのバンドルは、プロンプト7のようにuninstallコマンドでアンインストールできる。

プロンプト7 バンドルのアンインストール

osgi> uninstall 2

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.3.0.v20070530

osgi> 

JSR 291に対する評価

JSR 291は2007年5月08日から21日にかけて最終仕様の承認投票が行われ、賛成多数で通過している。しかしOSGiのオリジナルの仕様との違いが明確ではなく、JSRとして新たに定義する意味がないのではという批判もある。たとえばECの一因であるSun Microsystemsはこの点を問題視して反対票を投じている。また前述のように、Javaプラットフォーム標準のモジュラリティ・サポートとしてはすでにJSR 277が有力候補となっているため、JSR 291の価値を疑問視する声も上がってる。

一方で、JSR 291のExpert GroupがOSGi R4の策定に貢献した結果JSRとの整合性が確保できたとして、その活動を高く評価する声もある。OSGi実装がEclipseのプラグイン機構として採用され広く使われている実績も無視できない。いずれにせよ、Expert Groupとしては他のAPIに対するJSR 291の立ち位置を明確にしていく必要があるだろう。

19/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

ロバート秋山が扮する「クリエイターズ・ファイル展」開催中
[20:56 9/27] シゴト
「ぼくは麻理のなか」完結巻で色紙当たる、押見修造のサイン会も
[20:47 9/27] ホビー
JR北海道、石北本線上川~白滝間10/1復旧 - 特急「オホーツク」も運転再開
[20:44 9/27] ホビー
子どものストレス、世帯所得によって原因に違い
[20:32 9/27] マネー
[映画興行成績]「君の名は。」がV5 累計興収は111億円を突破
[20:30 9/27] エンタメ

求人情報