「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をエントリポイント(実行時に最初に呼び出されるクラス)に指定したものである。
【2】依存関係の設定
もし、モジュール内のクラスが外部ライブラリのクラスやパッケージ、モジュールに依存している場合には、その旨を下図に示すように「requires」というキーワードを付けて宣言する。
この例では、「com.foo」を利用するためには「org.bar.lib」「edu.baz.util」が必要であることを示している。
【3】バージョン制御
モジュールや依存するライブラリには、バージョン番号を適用することも可能で、バージョン番号は下図の例のように「@」を付けて宣言する。
【4】カプセル化
Jigsawでは、モジュールのカプセル化も検討されている。例えば、モジュールにアクセス権限を設定し、指定したモジュールからしかアクセスできないように設定できる。下図のように、モジュールの定義で「permits」というキーワードを使うことにで、「com.foo.secret@3」は指定されたモジュール「com.foo.lib」以外からはアクセスできないようになる。
【5】モジュールのパッケージング
このように、Jigsawにおけるモジュールの設定は「module-info.java」というファイルを通じて行う。では、こうして作成したモジュールをパッケージとしてまとめるには、どうしたらいいのだろうか。モジュールのパッケージングは2段階の手順で行う。
まず、「javac」コマンドによるコンパイル時に、次のように「-modulepath」オプションを使用する。
すると、指定したディレクトリ(この場合は「mods」)以下にコンパイル後の「.class」ファイルが集約される。これを、次のように「jpkg」コマンドによってパッケージングする。
これで、各モジュールごとに「.jmod」の拡張子を持ったモジュールファイルが作成される。
【6】複数モジュールのライブラリ化
また、複数のモジュールを集めてライブラリ化もできるという。この作業は「jmod」コマンドによって行う。次の例は、まず「mlib」という名前のライブラリを作成し、そこにカレントディレクトリにある.jmodファイルをすべて追加する例である。
【7】オプションモジュールの設定
モジュール/ライブラリからアプリケーションを起動するには、次のように「-L」オプションでライブラリを、「-m」オプションでモジュールを指定して、「java」コマンドを実行すればよい。
【8】モジュールをリポジトリで管理
その他、Jigsawでは「リポジトリ」の概念がサポートされる。これはLinuxのパッケージ管理機構などと同様に、リポジトリ上にあるモジュールやパッケージを手軽にインストールできるようにする仕組みでである。必要なモジュールやライブラリをリポジトリから自動でインストールするなど、依存関係の管理が容易になることを目的としている。
JDK自身もリポジトリで管理
さらに、上記のモジュールシステムをJDK自身にも適用することにもチャレンジするという。すなわち、JDKの機能をAPIの種類ごとにきちんと分割して、必要な機能だけをインストールして使えるような仕組みを構築するということである。これによって、不要なAPIを読み込む必要がなくなるため、インストール時間や起動時間の最適化が実現できるという。
Copyright © ITmedia, Inc. All Rights Reserved.