Jigsaw

自分が行った学習手順

  • 前述OpenJDKサイトのQuick Startのページを見て概要をつかむ。

    • 最初は Services 節くらいまで読めば良いように思う(実際のところ The linker (jlink)など使用する機会はそう無いのでは)。

  • Mavenでの利用方法がわからなかったので書籍http://amzn.to/2CLmjCm[Java 9 Modularity]の11章を流し読みする。従来と使用方法は変わらないようだった。

    • コードはhttps://github.com/java9-modularity/examples/tree/master/chapter11[こちら]にある。これだけ見ても概ね理解できるはず。

module-info.java 内で使用するキーワード

JLS 7.7 Module Declarations (HTML版, PDF Jigsaw差分表記版)より。

既に次のページに日本語解説があったのでそちらも参照のこと。

ModuleDeclaration:
{Annotation} [open] module Identifier {. Identifier}
{ {ModuleDirective} }
  • `open`を指定していない場合(ノーマルモジュールの場合)、コンパイル時、実行時ともに明示的にexportされたパッケージのみ参照を許可する。`open`を指定した場合(オープンモジュールの場合)、コンパイル時には明示的にexportされたパッケージのみ参照を許可する(この点はノーマルモジュールと同様)。実行時は、ノーマルモジュールと異なり、全パッケージの参照を許可する。

    • `open`はリフレクションによるアクセスを想定した仕様の模様。詳細はJLS 7.7節参照。

    • 後述の`opens`モジュールディレクティブはパッケージごとの指定だが、オープンモジュールにすれば全パッケージが対象になる、ということのようだ。

ModuleDirective:
requires {RequiresModifier} ModuleName ;
exports PackageName [to ModuleName {, ModuleName}] ;
opens PackageName [to ModuleName {, ModuleName}] ;
uses TypeName ;
provides TypeName with TypeName {, TypeName} ;
  • モジュールディレクティブについては次節にまとめた。

RequiresModifier:
(one of)
transitive static
  • 後述の`requires`モジュールディレクティブ説明の中で言及。

モジュールディレクティブ

requires

  • 依存先(自身が参照しているモジュール)を指定するディレクティブ。

  • `java.base`は自動で設定されるので明記してはいけない。

  • transitive: 自身をrequireしたモジュールは、`requires transitive`で指定しておいたモジュールもrequireしたことになる。つまり、`requires transitive`で指定したモジュールも暗黙的に使用可能になる。

  • static: `requires static`は、コンパイル時には必要だが実行時には必ずしも必要でないモジュールに対して記述する。

    • 書籍「Java 9 Modularity」5.6.1節 "Compile-Time Dependencies" では、コンパイル時のアノテーションプロセッシング(のみ)に必要なモジュールを指定するような例が書かれていた。

exports, opens

  • `exports`にはコンパイル時及び実行時にアクセスを許可するパッケージを記述する。

  • `opens`には実行時にアクセスを許可するパッケージを記述する。コンパイル時には許可しないのが`exports`と異なる。

    • 前述の`open`によるオープンモジュール指定の、パッケージ個別指定版のようなものか。

  • exports, `opens`ともに`to`で特定のモジュールに対してのみアクセスを許可するような設定が可能。

uses

provides [service] with [service provider]

  • サービスプロバイダの記述に用いる。

  • サービスプロバイダとは、`uses`節で記載した、サービスを継承/実装した具象クラス。

  • こちらについても`uses`節で記載したリンク先を読むべし。

ビルドツール等の対応

Maven Compiler Plugin

  • configuration で release (9のjavacコマンドで使用できるオプション。 参考) が利用できるようになっている。

Exec Maven Plugin

java9に対応した modulepathの指定、実行クラスの指定ができるようになっている。