java9 and project jigsaw

20
Java9 and Project Jigsaw #渋谷java @takezoen BizReach, Inc

Upload: takezoe

Post on 07-Jan-2017

5.250 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Java9 and Project Jigsaw

Java9 and Project Jigsaw#渋谷java

@takezoenBizReach, Inc

Page 2: Java9 and Project Jigsaw

Java9

● 2017年3月リリース予定

● 目玉機能:Project Jigsaw

Page 3: Java9 and Project Jigsaw

Project Jigsawとは?

● モジュール管理のための仕組み

○ 複雑化しがちな依存関係、同一ライブラリのバージョン衝

突といったクラスパス問題(Jar Hell)を解決

● JDK自体もモジュール化される○ というか元々JDKのモジュール化が目的だった

○ 必要なモジュールだけでJDKのサブセットを構成可能

○ 組み込み機器等での利用が想定される

Page 4: Java9 and Project Jigsaw

従来との違い

● 従来のクラスパスを置き換える

○ 互換性のためクラスパスとの併用も可能

○ Jigsawのモジュールシステムからクラスをロードできない

場合はクラスパスから読み込む

● Mavenの依存ライブラリ管理機能との違い○ 依存関係だけでなく可視性も定義できる

○ Mavenはビルド時のモジュールシステムだがJigsawは実

行時もサポートする

Page 5: Java9 and Project Jigsaw

延期に次ぐ延期

● 2008年○ Project Jigsaw開始(Sun時代)

● 2010年○ Java7のリリースを優先するためLambdaと共にJava8に

先送り

● 2012年○ Java8のリリースを優先するためJava9に先送り

● 2015年○ Jigsawを入れるためにJava9のリリースを半年延期

Page 6: Java9 and Project Jigsaw

モジュールの例

Appモジュール

Utilモジュール

Page 7: Java9 and Project Jigsaw

モジュールの例

クラスパスルートにmodule-info.javaを作成

Page 8: Java9 and Project Jigsaw

module-info.javaの内容

// Utilモジュール

module Util { exports sample.util;}

// Appモジュール

module App { requires Util;}

このモジュールにはUtilモジュールが必要であることを宣言

sample.utilパッケージを他のモジュールから使えるようにエクスポート

Page 9: Java9 and Project Jigsaw

# マルチモジュールプロジェクトのコンパイル

javac -d build -modulesourcepath src $(find src -name "*.java")

コンパイル

Page 10: Java9 and Project Jigsaw

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

Page 11: Java9 and Project Jigsaw

パッケージング

# パッケージング

jlink --modulepath $JAVA_HOME/jmods:mlib --addmods App --output app

実行ファイル

Page 12: Java9 and Project Jigsaw

module-info.javaに書ける内容

● exports○ 他のモジュールに公開するパッケージを宣言する

● requires○ このモジュールに必要なモジュールを宣言する

● uses、provides○ ServiceLoaderでロード可能なサービスを宣言する

Page 13: Java9 and Project Jigsaw

exports

● 他のモジュールに公開するパッケージを指定

● 特定のモジュールにのみエクスポートすることも

可能

module Util { exports sample.util; exports sample.util to App;}

Page 14: Java9 and Project Jigsaw

requires

● 必要なモジュールを宣言

● publicをつけることで再エクスポート可能

module App { requires Storage; requires public Util;}

Page 15: Java9 and Project Jigsaw

uses, provides

● ServiceLoaderでロード可能なサービスを提供

する

// こんな感じでロードできるやつ

ServiceLoader<Storage> loader = ServiceLoader.load(Storage.class);Iterator<Storage> ite = loader.iterator();

Page 16: Java9 and Project Jigsaw

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を提供

Page 17: Java9 and Project Jigsaw

JDKのパッケージもモジュール化されている

● java.base● java.logging● java.xml● java.sql● java.desktop● など

Page 18: Java9 and Project Jigsaw

依存関係を見てみる

$ 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

Page 19: Java9 and Project Jigsaw

注意事項

● エクステンションディレクトリが廃止されるため、そ

れを利用したハックができなくなる

● ビルドツール、IDEやミドルウェアなど周辺環境の

対応も必要

Page 20: Java9 and Project Jigsaw

試してみよう

● JDK9 Early Access with Project Jigsaw○ https://jdk9.java.net/jigsaw/

● NetBeansのJigsawサポート○ http://wiki.netbeans.org/JigsawSupport