皆さんは、JSR-277として提案されている「Java Module System」をご存知だろうか。Java 7に導入される予定の仕様であり、ドラフトがこちらのサイトで公開されている。

Java SE 7では、広範にわたって様々な変更が行われると考えられており、その変化の度合いはJ2SE 5.0を上回る可能性があると指摘されているほどだ。なかでもJava Module SystemはJavaプログラムのパッケージング、配布、実行の方法を根本から変えてしまう可能性のある、魅力的な仕様だ。今回その詳細について調査を行ったので、レポートしたいと思う。なお、本稿はEarly Draftバージョンを基にしているので、正式リリースまでに仕様変更が生じる可能性がある。この点はあらかじめご容赦いただきたい。

Java Module Systemが解決しようとしている問題は以下のようなものだ。

  • 使用しているライブラリの依存関係が複雑になってくると、管理に多大なコストがかかる。特に、同じライブラリなのに違うバージョンのJARファイルが読み込まれていたりすると、多大な問題を抱えることになる
  • 複数のアプリケーションで、ライブラリを共有することができない。JARファイル内に、信頼できる識別子、バージョン情報が存在しないため、ライブラリを安全に共有する方法がない。従って、アプリケーションごとにライブラリJARファイルのコピーを持つ必要があり、アプリケーションのファイルサイズが肥大化する
  • JARファイルの入手が面倒。ライブラリを利用する場合、まずWebサイトを訪問して、ディストリビューションをダウンロードし、解凍してJARファイルを取り出して……といった手間がかかる
  • publicと指定したクラスは、あらゆる場所から使用できてしまう。よって、ライブラリ内だけで使用するクラス、などといったアクセス指定が行えない

こうした問題を部分的に解決するツールとして、Apache Mavenがある。Mavenは依存関係の宣言、ライブラリJARファイルの自動ダウンロード機能を備えるビルドツールだ。ただし、Mavenを使って解決できるのは開発時のJARの管理、JARの入手という点のみであり、根本的な解決には至らない。

Java Module Systemはこうした問題を以下のように解決しようとしている。

  • モジュールの物理的な表現としてJAM(Java Application Modules)ファイルという概念を導入し、モジュール名とバージョンをメタデータとして定義できるようにし、セキュリティの確保も行う
  • 上記によりリポジトリにJAMファイルを格納しておき、複数のアプリケーションからライブラリを共有することが可能になる
  • メタデータ内でモジュール外にクラスを公開するかしないか、というアクセス指定を行うことができるようにする

では、一つ一つを詳細に見ていこう。