Project Jigsawの紹介も5回目になりました。前回はモジュールでの公開について解説しました。これで、モジュールの定義、依存性の記述、公開範囲の設定と、モジュールに関して解説してきたことになります。
今回は、これまでとはちょっと変わって、モジュールを扱うモジュールパスと今までのクラスパスの併用について解説していきます。
クラスパスを使用するということは、既存のライブラリーをProject Jigsawで扱うということ、つまり後方互換性の問題となります。もちろん、Project Jigsawでは後方互換性が考えられており、クラスパスを使用できます。
モジュールパスとクラスパスの併用には2つのシナリオがあります。
- モジュールではないアプリケーションからモジュールを使用する
- モジュールで構成されるアプリケーションでクラスパスを使用する
それぞれの場合について、説明していきましょう。
非モジュールアプリケーションからモジュールを使用する
まずは、モジュールで構成されていないアプリケーションからモジュールを使用することを考えていきましょう。実を言うと、これはとても簡単に実現できます。
モジュールJARファイルは、既存のアプリケーションとの互換性を考慮し、単なるJARファイルとして扱うことが可能なのです。つまり、モジュールJARファイルであっても、クラスパスで指定することで通常のJARファイルとして扱えます。
モジュールJARファイルを通常のJARファイルとして扱う
ここでは、サンプルとして足し算を行うCalculatorインタフェースを考えてみます。Calculatorインタフェースをリスト1に示します。
リスト1●Calculatorインタフェース
package net.javainthebox.calc;
import net.javainthebox.calc.impl.SimpleCalculator;
public interface Calculator {
public static Calculator of(){
return SimpleCalculator.of();
}
public Calculator add(double x);
public double get();
}
そして、Calculatorインタフェースの実装クラスとしてSimpleCalculatorクラスを定義します(リスト2)。
リスト2●SimpleCalculatorクラス
package net.javainthebox.calc.impl;
import net.javainthebox.calc.Calculator;
public class SimpleCalculator implements Calculator {
private double value = 0.0;
private SimpleCalculator() {}
public static SimpleCalculator of(){
return new SimpleCalculator();
}
public SimpleCalculator add(double x) {
value += x;
return this;
}
public double get() {
return value;
}
}
このサンプルではモジュール外に公開するのはCalculatorインタフェースだけで、SimpleCalculatorクラスは公開しないことにしましょう。モジュール定義を行うmodule-info.javaは以下のようになります。
リスト3●module-info.javaファイル
module net.javainthebox.calc {
exports net.javainthebox.calc;
}
exports文でnet.javainthebox.calcパッケージのみ公開し、SimpleCalculatorクラスが定義されているnet.javainthebox.calc.implパッケージは公開していません。
このモジュールをコンパイルし、モジュールJARファイルを作成します。ここではcalculator.jarファイルとしましょう。このcalculator.jarファイルをmodsディレクトリに配置しておきます。