【コラム】

Java API、使ってますか?

12 Javaアプリケーションのモジュール化をサポートするJava Module System

12/60

Java Module Systemとは

Java SE 7における重要な機能強化のひとつとしてモジュラリティのサポートが挙げられている。その核となるのが「JSR 294: Java Language Modularity Support with Superpackage」と「JSR 277: Java Module System」の2つのJSRである。両者はお互いに密接に関係しているが、区分としてはJSR 294が「開発時のモジュラリティ」、JSR 277が「配付時のモジュラリティ」を提供するものという位置づけになっている。

このうち、JSR 294についてはJavaOneレポートでテクニカルセッションの様子を紹介したので、そちらを参照していただきたい。今回はJava Module Systemについて紹介したいと思う。

現在、Javaアプリケーションの配布にはJAR(Java ARchive)が使用されている。しかしJARの規格が制定されたのはまだJavaが若かったころのことであり、バージョン管理や依存関係の解決をサポートしていないなど、現在のアプリケーションに適用するには不十分な部分が多い。JSR 277ではこういったJARの問題を解決するために、新しい配布単位としてのモジュールシステムを検討している。

具体的には、Java Module Systemでは主に次のような機能が提供される予定だ。

  • 新しいメタデータ形式を含む配布単位(JAM)
  • バージョン管理スキーム
  • モジュール管理のためのリポジトリ
  • クラスローダやアプリケーションランチャにおける実行時サポート
  • 各種サポートツール

JSR 277は現在JCPのサイトにおいてEarly Draftが公開されている。

Java Application Module

Java Application Module(JAM)はJSR 277で規定される、JARに替わるJavaアプリケーションの新しい配布単位である。JAMは名前、インポートするモジュール、エクスポートするクラス、メンバ、拡張メタデータからなる新しい形式のメタデータを保持する。モジュール名は「org.foo.xml」のような形式で表される。また拡張メタデータはバージョン情報やメインクラス名、属性などの情報を持つ。

他のモジュールのインポートや、モジュール内のクラスのエクスポート宣言については、リスト1およびリスト2のようなコード例が示されている。

インポートの宣言例

// org.foo.soapモジュールをインポート
superpackage org.foo.xml {
    import org.foo.soap;
}

// バージョンを指定したオプションインポート
superpackage org.foo.xml {
    @Optional
    @VersionConstraint("1.3")
    import org.foo.soap;
}

// 再エクスポート
superpackage org.foo.xml {
    @Reexport
    import org.foo.soap;
}

エクスポートの宣言例

@Version("1.2.3")
@ExportResources({
    "icons/graphics1.jpg", 
    "icons/graphics2.jpg"})
superpackage org.foo.xml {
    export org.foo.xml.*;
}

アプリケーションモジュールは.jamという拡張子を持つJAMファイルとして配布される。JAMファイルのファイル名は次のようにする。

<名前>-<バージョン>[-<プラットフォーム>-<アーキテクチャ>].jam

たとえばx86 Linux向けorg.foo.xmlモジュールのバージョン1.2.3ならば、「org.foo.xml-1.2.3-linux-x86.jam」のようになる。JAMファイルの中にはメタデータ、ネイティブライブラリ、JARファイル、クラスやファイルなどのリソースが含まれ、リスト3のような構成になる。

リスト3 JAMファイルの構成例

org.foo.xml-1.2.3.jam:
        /META-INF/MANIFEST.MF
        /MODULE-INF/METADATA.module        ←メタデータ
        /MODULE-INF/bin/xml-linux.so       ←ネイティブライブラリ
        /MODULE-INF/lib/xml-parser.jar     ←JARファイル
        /org/foo/xml/org.foo.xml.spkg
        /org/foo/xml/ClassA.class
        /org/foo/xml/ClassB.class
        /org/foo/xml/ClassC.class
        /isons/graphics1.jpg
        /icons/graphics2.jpg

この構成を見てもわかるように、既存のJAR規格はJAMに内包される形式になっており、なくなるわけではない。

リポジトリの導入

リポジトリはモジュールの格納や検索を行うためのメカニズムで、アプリケーションにおけるモジュールの管理をサポートする。Java Module Systemのリポジトリは複数バージョンのモジュールの同時インストールやside-by-side配置を可能にする。

リポジトリには複数の種類があり、Early Draftでは下記のようなものが挙げられている。

  • Bootstrapリポジトリ - モジュールシステムの基本となるリポジトリ
  • Globalリポジトリ - システムごとに用意されるリポジトリ
  • Applicationリポジトリ - アプリケーションごとのリポジトリ
  • Localリポジトリ - ローカルファイルのコードベースによって管理されるリポジトリ
  • URLリポジトリ - URL形式のコードベースによって管理されるリポジトリ

通常はBootstrap-Global-Applicationという階層構造を持つ。ひとつのリポジトリが複数の子リポジトリを持つこともできる。リポジトリの階層構造は移譲モデルを採用しており、下位のリポジトリでモジュール定義が要求された場合でも上の階層まで遡って検索する。

他のJSRとの互換性

前述の通り、JSR 277はJSR 294と密接に関係している。たとえばJSR 294で定められるSuperpackageの規格がJAMの仕様に影響を与えるといったこともあるため、両者を切り離して考えることはできない。また、JSR 277はJSR 291:Dynamic Component Support for Java SEとも関連している。JSR 291はOSGiから提唱されているダイナミックコンポーネントモデル仕様をベースにしたフレームワークで、パッケージ間の依存関係の解決をサポートする。

そのため、これらJSRのエキスパートグループではお互いに情報交換を行いながら矛盾が生じないように仕様の策定を進めているという。なお、これらのJSRの違いについてはJSR 291のスペックリードであるGlyn Normington氏のブログに解説が掲載されている。

12/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」に登録してください。

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



人気記事

一覧

イチオシ記事

新着記事