Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java9 and Project Jigsaw

10,524 views

Published on

#渋谷java

Published in: Software

Java9 and Project Jigsaw

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

×