参考リンク
Webサイト
-
Project Jigsaw: Quick Start Guide - OpenJDKのページ
-
Java 9 - Jigsaw - Apache Maven - Apache Software Foundation - MavenプラグインのJava9対応状況
書籍
-
Java 9 Modularity - Oreilly
-
The Java Module System - Manning
自分が行った学習手順
-
前述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差分表記版)より。
既に次のページに日本語解説があったのでそちらも参照のこと。
-
-
ソフトウェアエンジニアリング - Torutk]
-
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
-
`java.util.ServiceLoader`を用いてロード可能なサービスの記述に用いる。
-
こちらのサイトが詳しい: http://d.hatena.ne.jp/bitter_fox/20160720/1469042323[JigsawでSPIを使用する
-
きつねとJava!]
-
-
ServiceLoaderのJavaDocも参考になる。
provides [service] with [service provider]
-
サービスプロバイダの記述に用いる。
-
サービスプロバイダとは、`uses`節で記載した、サービスを継承/実装した具象クラス。
-
こちらについても`uses`節で記載したリンク先を読むべし。
ビルドツール等の対応
Exec Maven Plugin
java9に対応した modulepathの指定、実行クラスの指定ができるようになっている。