はじめに
Java SE11(Silver)で新たに試験項目に追加されたモジュールシステムについて、
基本事項をサンプルを交えて説明し、試験で必要そうなポイントを紹介していきたいと思います。
今回は第3回目で、前回扱ったコマンドライン操作の関する補足的な内容を説明していきます。
特に試験で問われそうなポイントに絞って紹介します。
初めての方はこちらからどうぞ ⇒ 第1回【概要・準備編】
1.requires transitive
前回のモジュール依存関係を改めて整理すると以下の状態でした。
そして、それぞれのmodule-info.javaは以下の通りです。
module myclient{ requires myservice; }
module myservice{ exports jp.ssie.ocjp.service; requires myutil; }
module myutil{ exports jp.ssie.ocjp.util; }
このようにすることでmyclientからはmyutilを呼び出せないことを前回確認しました。
ここで紹介するのはmyclientからmyutilにアクセスする方法で、
transitiveキーワードを使用してmyserviceのmodule-infoを以下に書き換えます。
module myservice{ exports jp.ssie.ocjp.service; requires transitive myutil; }
なお、前回の続きで確認する場合は以下のような手順を行います。
①myserviceをコンパイル
②service.jarを再度生成
③service.jarをmyclientのlibフォルダに再配置(上書き)
④myclientをコンパイル⇒実行
2.--add-exports
exportsされていないパッケージを一時的に公開して使用するためのオプションに、
「--add-exports」があります。
構文は以下です。
--add-exports 対象モジュール/公開するパッケージ=利用側モジュール
以下手順で確認可能です。
①myserviceのmodule-infoでexportsをコメントアウト
module myservice{ // exports jp.ssie.ocjp.service; requires myutil; }
②myserviceをコンパイル、jar生成、myclientのlibに配置
※コマンドは前回記事と同じ
③以下コマンドでコンパイル(myclientディレクトリで実行)
javac -d ./bin -encoding utf-8 --module-path ./lib/service.jar;./lib/util.jar; \ --add-exports myservice/jp.ssie.ocjp.service=myclient \ ./src/module-info.java ./src/jp/ssie/ocjp/client/MyClient.java
※長いので「\」で改行を入れました。
※Windows環境では「^」に置き換えるか削除して一行とする必要があるので注意してください。
※前回記事のコマンドではコンパイルエラーとなるのを確認してみて下さい。
④以下コマンドで実行(myclientディレクトリで実行)
java --module-path ./bin;./lib/service.jar;./lib/util.jar; \ --add-exports myservice/jp.ssie.ocjp.service=myclient \ -m myclient/jp.ssie.ocjp.client.MyClient
※javaコマンドでも--add-exportsを使います。
まとめ
以上、モジュール関連の補足内容となります。
この他にも試験内容にはモジュール情報の確認コマンドが含まれますが、
仕組みと言うよりも暗記要素の強い内容となるので割愛します。