java9 and project jigsaw
TRANSCRIPT
Java9 and Project Jigsaw#渋谷java
@takezoenBizReach, Inc
Java9
● 2017年3月リリース予定
● 目玉機能:Project Jigsaw
Project Jigsawとは?
● モジュール管理のための仕組み
○ 複雑化しがちな依存関係、同一ライブラリのバージョン衝
突といったクラスパス問題(Jar Hell)を解決
● JDK自体もモジュール化される○ というか元々JDKのモジュール化が目的だった
○ 必要なモジュールだけでJDKのサブセットを構成可能
○ 組み込み機器等での利用が想定される
従来との違い
● 従来のクラスパスを置き換える
○ 互換性のためクラスパスとの併用も可能
○ Jigsawのモジュールシステムからクラスをロードできない
場合はクラスパスから読み込む
● Mavenの依存ライブラリ管理機能との違い○ 依存関係だけでなく可視性も定義できる
○ Mavenはビルド時のモジュールシステムだがJigsawは実
行時もサポートする
延期に次ぐ延期
● 2008年○ Project Jigsaw開始(Sun時代)
● 2010年○ Java7のリリースを優先するためLambdaと共にJava8に
先送り
● 2012年○ Java8のリリースを優先するためJava9に先送り
● 2015年○ Jigsawを入れるためにJava9のリリースを半年延期
モジュールの例
Appモジュール
Utilモジュール
モジュールの例
クラスパスルートにmodule-info.javaを作成
module-info.javaの内容
// Utilモジュール
module Util { exports sample.util;}
// Appモジュール
module App { requires Util;}
このモジュールにはUtilモジュールが必要であることを宣言
sample.utilパッケージを他のモジュールから使えるようにエクスポート
# マルチモジュールプロジェクトのコンパイル
javac -d build -modulesourcepath src $(find src -name "*.java")
コンパイル
jarの作成と実行
# Jigsaw対応のjarを作成
jar --create --file mlib/[email protected] --module-version 1.0 -C build/Util .
# Mainクラスを指定
jar --create --file mlib/[email protected] --module-version 1.0 --main-class sample.app.Main -C build/App .
# 実行
java -mp mlib -m App
パッケージング
# パッケージング
jlink --modulepath $JAVA_HOME/jmods:mlib --addmods App --output app
実行ファイル
module-info.javaに書ける内容
● exports○ 他のモジュールに公開するパッケージを宣言する
● requires○ このモジュールに必要なモジュールを宣言する
● uses、provides○ ServiceLoaderでロード可能なサービスを宣言する
exports
● 他のモジュールに公開するパッケージを指定
● 特定のモジュールにのみエクスポートすることも
可能
module Util { exports sample.util; exports sample.util to App;}
requires
● 必要なモジュールを宣言
● publicをつけることで再エクスポート可能
module App { requires Storage; requires public Util;}
uses, provides
● ServiceLoaderでロード可能なサービスを提供
する
// こんな感じでロードできるやつ
ServiceLoader<Storage> loader = ServiceLoader.load(Storage.class);Iterator<Storage> ite = loader.iterator();
uses, provides
module Storage { exports sample.storage; uses sample.storage.Storage}
module S3Storage { requires Storage; provides sample.storage.Storage with sample.storage.s3.S3Storage;}
Storageの実装を要求
Storageの実装としてS3Storageを提供
JDKのパッケージもモジュール化されている
● java.base● java.logging● java.xml● java.sql● java.desktop● など
依存関係を見てみる
$ jdeps -module mlib/Util\@[email protected] -> java.base Util ([email protected]) -> sample.util [email protected] sample.util ([email protected]) -> java.io java.base -> java.lang java.base -> java.util java.base
注意事項
● エクステンションディレクトリが廃止されるため、そ
れを利用したハックができなくなる
● ビルドツール、IDEやミドルウェアなど周辺環境の
対応も必要
試してみよう
● JDK9 Early Access with Project Jigsaw○ https://jdk9.java.net/jigsaw/
● NetBeansのJigsawサポート○ http://wiki.netbeans.org/JigsawSupport