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ディレクトリに配置しておきます。