ラムダ式、JAR脱獄、JavaScript/Node.jsに接近するJDK 8、そして9へJavaOne Tokyo 2012まとめレポート(後編)(2/3 ページ)

» 2012年04月19日 00時00分 公開
[杉山貴章有限会社オングス]

「JAR地獄」から抜け出すための「Project Jigsaw」

 Java SE 8でProject Lamdaと並んで大きな改革になりそうなのが「Project Jigsaw」だ。JavaOne Tokyoでは、Holmes氏がセッション「Project Jigsaw: Putting it Together」において、この新しいモジュールシステムを解説した。

 現在のJavaプラットフォームでは、アプリケーションのパッケージング方法として「JAR(Java Archive)」システムを提供している。しかし、このJARの仕組みはJavaの初期に作られたもので、現在のように大量のライブラリが複雑に依存し合う大規模なシステムを想定したものではない。そこで、新しいモジュール化の仕組みを構築しようというのがProject Jigsawの目的である。

 Jigsawでは、適切なモジュールシステムを構築することによって、次のような項目の実現を目標として掲げている。

  • 「JAR地獄」の解消
    クラスパス指定の必要をなくす
  • ライブラリの依存関係をソースコードに記述できるように
  • 必要なモジュールを自動でダウンロード・インストールできるように
  • Javaプラットフォームのスケーラビリティの向上
    小さなデバイスにも適用可能なJava SEのサブセットを作れるようにする
  • パフォーマンスの改善
    ダウンロード時間や起動時間を改善する

 Holmes氏によれば、Jigsawではモジュール化に関する次のような機能が提供される予定だという。

 以下、1つ1つ解説しよう。

 【1】グループ化

 まず、基本となるのは「グループ化」だ。Jigsawでは、複数のクラスやライブラリをまとめてモジュールを作る。モジュールの定義は、パッケージのルートディレクトリに「module-info.java」というファイルに「module」というキーワードを使って記述する。

 以下の例は、「com.foo.Main」「com.foo.Other」「com.foo.ui.Shell」という3つのクラスを持つモジュールを作成し、com.foo.Mainをエントリポイント(実行時に最初に呼び出されるクラス)に指定したものである。

モジュールの設定は「module-info.java」に記載(Holmes氏の講演資料より) モジュールの設定は「module-info.java」に記載(Holmes氏の講演資料より)

 【2】依存関係の設定

 もし、モジュール内のクラスが外部ライブラリのクラスやパッケージ、モジュールに依存している場合には、その旨を下図に示すように「requires」というキーワードを付けて宣言する。

ライブラリの依存関係は「require」キーワードで定義(Holmes氏の講演資料より) ライブラリの依存関係は「require」キーワードで定義(Holmes氏の講演資料より)

 この例では、「com.foo」を利用するためには「org.bar.lib」「edu.baz.util」が必要であることを示している。

 【3】バージョン制御

 モジュールや依存するライブラリには、バージョン番号を適用することも可能で、バージョン番号は下図の例のように「@」を付けて宣言する。

バージョン番号の指定も可能(Holmes氏の講演資料より) バージョン番号の指定も可能(Holmes氏の講演資料より)

 【4】カプセル化

 Jigsawでは、モジュールのカプセル化も検討されている。例えば、モジュールにアクセス権限を設定し、指定したモジュールからしかアクセスできないように設定できる。下図のように、モジュールの定義で「permits」というキーワードを使うことにで、「com.foo.secret@3」は指定されたモジュール「com.foo.lib」以外からはアクセスできないようになる。

「permits」キーワードによってモジュールの隠ぺい性を確保(Holmes氏の講演資料より) 「permits」キーワードによってモジュールの隠ぺい性を確保(Holmes氏の講演資料より)

 【5】モジュールのパッケージング

 このように、Jigsawにおけるモジュールの設定は「module-info.java」というファイルを通じて行う。では、こうして作成したモジュールをパッケージとしてまとめるには、どうしたらいいのだろうか。モジュールのパッケージングは2段階の手順で行う。

 まず、「javac」コマンドによるコンパイル時に、次のように「-modulepath」オプションを使用する。

プロンプト1 プロンプト1

 すると、指定したディレクトリ(この場合は「mods」)以下にコンパイル後の「.class」ファイルが集約される。これを、次のように「jpkg」コマンドによってパッケージングする。

プロンプト2 プロンプト2

 これで、各モジュールごとに「.jmod」の拡張子を持ったモジュールファイルが作成される。

 【6】複数モジュールのライブラリ化

 また、複数のモジュールを集めてライブラリ化もできるという。この作業は「jmod」コマンドによって行う。次の例は、まず「mlib」という名前のライブラリを作成し、そこにカレントディレクトリにある.jmodファイルをすべて追加する例である。

プロンプト3 プロンプト3

 【7】オプションモジュールの設定

 モジュール/ライブラリからアプリケーションを起動するには、次のように「-L」オプションでライブラリを、「-m」オプションでモジュールを指定して、「java」コマンドを実行すればよい。

プロンプト4 プロンプト4

 【8】モジュールをリポジトリで管理

 その他、Jigsawでは「リポジトリ」の概念がサポートされる。これはLinuxのパッケージ管理機構などと同様に、リポジトリ上にあるモジュールやパッケージを手軽にインストールできるようにする仕組みでである。必要なモジュールやライブラリをリポジトリから自動でインストールするなど、依存関係の管理が容易になることを目的としている。

モジュールをリポジトリで管理(Holmes氏の講演資料より) モジュールをリポジトリで管理(Holmes氏の講演資料より)

 JDK自身もリポジトリで管理

 さらに、上記のモジュールシステムをJDK自身にも適用することにもチャレンジするという。すなわち、JDKの機能をAPIの種類ごとにきちんと分割して、必要な機能だけをインストールして使えるような仕組みを構築するということである。これによって、不要なAPIを読み込む必要がなくなるため、インストール時間や起動時間の最適化が実現できるという。

JDK自身にもJigsawのモジュールシステムを適用(Holmes氏の講演資料より) JDK自身にもJigsawのモジュールシステムを適用(Holmes氏の講演資料より)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。