Javaモジュール
システム雑なまとめ
持田真哉(@mike_neck)
概要
• ここ2週間くらいブログ(http://mike-
neck.hatenadiary.com/)に連載していた
Gradle3でのJavaプロジェクトのビルドの雑な
まとめ
• ついでにJigsawの雑なまとめ
誰?
• 持田真哉
• @mike_neck
• 仕事:何もやってない
開発あるある
• Aチーム「このTransactionHistoryServiceInternalSupportク
ラス変更した?急にメソッドが使えなくなったんだけど?」
• Bチーム「え、そのクラス使ってたの?それうちのチームだけが
使うために作ったクラスなので、使わないでもらえますか?」
• Aチーム「いや、結構いろんなところで使ってて、それは無理な
んで、元に戻して」
• 課長「Aチームの開発が今回の拡張開発の目玉なのでBチームは
元に戻して」
開発あるある
• Aチーム「このTransactionHistoryServiceInternalSupportク
ラス変更した?急にメソッドが使えなくなったんだけど?」
• Bチーム「え、そのクラス使ってたの?それうちのチームだけが
使うために作ったクラスなので、使わないでもらえますか?」
• Aチーム「いや、結構いろんなところで使ってて、それは無理な
んで、元に戻して」
• 課長「Aチームの開発が今回の拡張開発の目玉なのでBチームは
元に戻して」
他のチームの開発したインターナル
クラス使ってたら、ある日突然
コンパイルエラー
何が問題なのか
• プロジェクトが大規模になるにつれて、Javaが
標準で提供しているアクセス制御(public/
protected/package private/private)だけでは
制御しきれない、クラスアクセスなどが発生す
るようになる
• 特にライブラリー内部だけで利用されるクラス
をユーザーが利用してしまうケース
とりあえずの回避策
山本裕介『失敗から学ぶAPI設計』- 36ページ

(http://www.slideshare.net/yusukey/api-ccch4-jjug-jjugccc-jjug-ccc-2013-
spring)
でも、これって本質的
じゃないよね
本当にやりたいことは
• 次の二つのクラスを分離させること
• ユーザーが使って良いクラス
• ユーザーが使うべきではないクラス
クラスレベルでのカプ
セル化
strong encapsulation
(強固なカプセル化)
Gradle 2.9 Document Chapter70. Building Java Librariesより
それを実現するのが、
Javaモジュールシステム
Javaモジュールシステムを実
装しているもの
• Scala
• JDK 9 Jigsaw
• Gradle JVM component plugin
Scala
• よくわかってないから、省略
• sealedとか
• private [this]とか
• むしろ教えてくれ
JDK 9 Jigsaw
• module-info.javaによる明示的な公開設定
• exports - 外部に公開するパッケージ指定
• require - 利用モジュール指定
• require public - 推移的利用モジュール指定
• uses - サービスクラスの要求
• provides with - サービスクラスの提供
Gradle JVM component
plugin
• model{}ブロックDSLでの明示的な公開設定
• model.components.《name》 - ライブラリー名設定
• model.components.《name》.api.exports - 公開パッケージ
の指定
• model.components.《name》.api.dependencies.library - 利
用ライブラリーの指定(推移的利用ライブラリー)
• model.components.
《name》.sources.java.dependencies.library - 利用ライブラ
リーの指定(非推移的利用ライブラリー)
JigsawとGradleの比較
Jigsaw Gradle
外部への公開単位 パッケージ パッケージ
非推移的依存 ⃝ ⃝
推移的依存 ⃝ ⃝
サービスプロバイダ ⃝ ✕
既存ビルドツールと
の連携
△ 俺がビルドツールだ
詳しくは
• http://mike-neck.hatenadiary.com/entry/
2015/11/26/120143
• http://mike-neck.hatenadiary.com/entry/
2015/11/27/014839
• 「Gradle3 Java ビルド 実践」「Gradle
Jigsaw ビルド」で検索
ところで、僕が評価に
使ったjdk1.9.0-ea…
jarコマンドが壊れて
てjarが作れないんで…
Javaモジュールシステム
について
https://twitter.com/mike_neck/status/
669448328300638209
よい
みなさま今までありが
とうございました

Javaモジュールシステム雑なまとめ