前回より、Java SE 9の注目機能であるProject Jigsawを紹介しています。

 前回は、Project Jigsawの成り立ちや、その目的について解説しました。今回は、Project Jigsawで仕様策定したモジュールを作ってみましょう。

 とはいうものの、モジュールとは何なのかが分からなければ作りようがありません。そこで、まずモジュール自体の説明を行い、その後モジュールを作成していきます。

 なお、今回はJDK9b111を使用してサンプルを作成しました。JDK9の最新ビルドのダウンロードはjava.netのJDK9プロジェクトから行います。

モジュール

 モジュールの定義は以下のようになります。

モジュールは複数のパッケージやリソースなどを含む、自己記述可能なコードの集合

 複数のパッケージやリソースを含むものといえば、JARファイルが思いつきます。実際、モジュールはパッケージングとしてJARファイルを使用します。つまり、JARファイルの拡張といっても差し支えありません。

 では、JARファイルとモジュールの違いは何なのでしょうか。その違いは自己記述にあります。

 自己記述とは自分自身について説明することです。では、モジュールでの自己記述とは、どのようなことについて記述するのでしょう。主な記述項目を以下に示します。

  • モジュール名
  • 依存性
  • 公開可能範囲

 モジュール名は自分自身の名前ですから、記述するのは当たり前といえば当たり前です。

 では、依存性と公開可能範囲を記述するというのはどういうことなのでしょうか。それはクラスパスとJARファイルの問題点に起因します。

依存性

 大きなシステムを作成する際、全てを自前で作成するということはほとんどないはずです。Apache Software FoundationやEclipse Foundationなどによるオープンソースのライブラリーを使用することが、当たり前に行われています。そして、それらのライブラリーも他のライブラリーを使用していることが多くあります。

 すると、実行時にロードすべきJARファイルがどんどん増えてしまいます。しかし、JARファイルで構成されるライブラリーは、自身がどのライブラリーを使用しているかは明示できません。つまり、自身が依存しているライブラリーを記述できないのです。

 したがって、依存しているライブラリーはクラスパスで指定するしかありません。

 しかし、増えすぎたクラスパスは収拾がつかなくなりがちです。いわゆる、JARヘルと呼ばれるゆえんがここにあります。

 ところで、MavenやGradleなどのビルドツールは、ビルド時に依存しているライブラリーを記述できます。例えば、Mavenであればプロジェクトファイルpom.xmlに依存性を記述します。

 pom.xmlに記述していたような依存性を、自分自身が定義できるようにしたのがモジュールの依存性の記述なのです。

 Project Jigsawではモジュールのビルド時および実行時に、モジュールに記述された依存性から他のモジュールをロードします。依存しているモジュールが依存している他のモジュールをロードして、というように芋づる式にモジュールをロードしていきます。

 このように依存性を記述することで、JARファイルの問題の一つを解決できるのです。