Project Jigsawの4回目となる今回は、APIの公開について紹介します。前回は、モジュールの依存性について紹介しました。今回は、公開範囲の設定など、公開に関してもう少し詳しく解説していきましょう。
公開範囲の設定
前々回、モジュールの定義とパッケージの公開範囲の設定について簡単に紹介しました。
簡単におさらいすると、モジュールの定義はmodule-info.javaに、module文を使用して定義します。パッケージを公開する場合は、exports文でパッケージを指定するようにします。
例えば、net.javainthebox.fooモジュールがnet.javainthebox.barパッケージを公開する場合、module-info.javaはリスト1のようになります。
リスト1●net.javainthebox.fooモジュールの定義
module net.javainthebox.foo {
exports net.javainthebox.bar;
}
特定のモジュールにのみ公開
複数のモジュールから構成されているアプリケーションの場合、あるモジュールをアプリケーション内だけで使用したいことがあるかもしれません。例えば、内部用の実装なので、外部に公開したくない場合などがこれに相当します。
このような場合、exports文で公開するパッケージを、特定のモジュールに限定することが可能です。例えば、リスト1のnet.javainthebox.barパッケージを、net.javainthebox.bazモジュールとnet.javainthebox.quxモジュールだけに公開する場合、リスト2のように記述します。
リスト2●特定のモジュールだけにパッケージを公開する
module net.javainthebox.foo {
exports net.javainthebox.bar to net.javainthebox.baz, net.javainthebox.qux;
}
exportの後にパッケージを指定するところまで同じですが、その後に赤字で示したtoと公開するモジュールをカンマ区切りで列挙していきます。このように記述することで、toの後に指定したモジュールにだけパッケージを公開できます。それ以外のモジュールから、このパッケージにアクセスすると、IllegalAccessError例外がスローされます。
リスト2に示したmodule-info.javaをコンパイルする場合、モジュールパスにパッケージを公開するモジュールが配置されている必要があります。公開先のモジュールが存在しない場合、コンパイルエラーになります。このことから、module-info.javaのコンパイル時に、公開先のモジュールの有無をチェックしていることが分かります。