javaone 2015 jdk update (jigsaw) #j1jp
TRANSCRIPT
JDK Update
KUBOTA Yuji @sugarlife
NTT OSSセン
JavaOne 2015 報告会@東京
Copyright©2015 NTT corp. All Rights Reserved.
Glossary • Java SE –Oracle 提供 い JRE, JDK • JDK –Java Developer Kit – Oracle 提供 い
限 い (例:OpenJDK) 本 JDK 表現
Copyright©2015 NTT corp. All Rights Reserved. 2
KUBOTA Yuji @sugarlife • OpenJDK ー –コ 解析 GC ー ン , etc…
•解析支援 ー HeapStats 開 –多数 商用 元気 稼働中 :)
•難聴者 –資料的 多用
写真 人 セン 凄い 実感中 Copyright©2015 NTT corp. All Rights Reserved. 3
NTT OSSセン • NTT ー OSS 活用 支え 部隊
*)OSSVERT®:OSs Suites VERified Technically 技術検証済 OSS組合せ
事業会社
SI会社 問合せ対応 導入支援 保 等
技術検証 導入推進
/ ー 類開
技術者育成人材交流
各種 OSS コ
設計, 開, 運用
ー 各社 ー
ベン
NTT 研究所等
様
ー 連携
開 連携
ᬅOSS ー ー
NTT OSSセン
ᬆOSS適用推進 (OSSVERT®*検証)
ᬇ技術開 (DBMS,高可用 等)
ᬈソ 基盤技術力向
Kernel, PostgreSQL, Pacemaker, Tomcat, etc Copyright©2015 NTT corp. All Rights Reserved. 4
Why JavaOne ?
結婚式 ー 活躍 Copyright©2015 NTT corp. All Rights Reserved. 5
•課題:Java 進化方向 •人物:誰 何 担当 •詳細:技術内容や事例
JavaOne 行 何 見聞
個人的 重要 ン
Copyright©2015 NTT corp. All Rights Reserved. 6
現在 JDK 状況 • JDK 8 新版 –Oracle JDK JDK 7 以前 公開
ー 停 (有償版 続い ) –OpenJDK RedHat ン ン
• JDK 9 来年 ー 予定 –2015/12/10: Feature Complete –2016/09/22: General Availability
次 JavaOne 終日 合わせ Copyright©2015 NTT corp. All Rights Reserved. 7
何 大 く変わ ? • JDK 9 –Module 導入 (Project Jigsaw) •Mark Reinhold
• JDK 10+ –HW, OS へ 適化 (Project Valhalla,
Project Panama) • Brian Goetz, John Rose, Charles Nutter
10+ 殆 Update (去年 報告会) Copyright©2015 NTT corp. All Rights Reserved. 8
JDK 9 =
Project Jigsaw
Project Jigsaw JVM 変更(影響)範 多岐 渡 得 い面 あ
そ 以外 +
Copyright©2015 NTT corp. All Rights Reserved. 9
Project Jigsaw 以外 変更
Project Jigsaw 長い 後回 Copyright©2015 NTT corp. All Rights Reserved. 10
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac ー 関わ 言語や ー 変更点
Copyright©2015 NTT corp. All Rights Reserved. 11
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac
Read-Eval-Print-Loop Java 場 Good-bye {Sample,Example,Test}.java
Copyright©2015 NTT corp. All Rights Reserved. 12
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac
検索機能追加, HTML5対応, Doclet 改善, 等
Copyright©2015 NTT corp. All Rights Reserved. 13
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac
javac 古い ー ン N 合わせ 場合 -source N -target N 他
-bootclasspath jdkN/lib/rt.jar 必要 -release N
後 過去 3 ー ン 対応(9 6) Copyright©2015 NTT corp. All Rights Reserved. 14
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac
“_” 命 禁 , private interface methods,匿 ン 対応, 等
Copyright©2015 NTT corp. All Rights Reserved. 15
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac
jdk javac lint warnings 0
Copyright©2015 NTT corp. All Rights Reserved. 16
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac 超要約 Diamond Nest祭 く
Copyright©2015 NTT corp. All Rights Reserved. 17
Language and Tooling • User-facing features – jshell – Java.Doc.Next –Cross compiling and the javac –release –Milling Project Coin –Deprecation and imports
• Re-engineering javac 出展:https://blogs.oracle.com/darcy/resource/JavaOne/J1_2015-jdk9-
langtools.pdf P.99
Copyright©2015 NTT corp. All Rights Reserved. 18
非互換 変更点 • New version-string format, “_” 1文 命 禁 • 6 非推奨 ソ 削除 (JEP 162) • JDK 内部 API セ 化 (削除 い) • JDK / JRE ン ー 変更 (JEP 220)
– JDK jre 削除 – ー 編集可能 構成 lib conf へ, 等 – rt.jar, tools.jar 等 内部 削除 (再構築)
• ー 変え 以 削除 (JEP 261) – Endorsed-standards override and extension mechanisms – -Xbootclasspath, -Xbootclasspath/p, sun.boot.class.path
詳細や代替方法 各 JEP 確認 う Copyright©2015 NTT corp. All Rights Reserved. 19
非互換 変更点 • New version-string format, “_” 1文 命 禁 • 6 非推奨 ソ 削除 (JEP 162) • JDK 内部 API セ 化 (削除 い) • JDK / JRE ン ー 変更 (JEP 220)
– JDK jre 削除 – ー 編集可能 構成 lib conf へ, 等 – rt.jar, tools.jar 等 内部 削除 (再構築)
• ー 変え 以 削除 (JEP 261) – Endorsed-standards override and extension mechanisms – -Xbootclasspath, -Xbootclasspath/p, sun.boot.class.path
Jigsaw 影響 大 さ 窺え Copyright©2015 NTT corp. All Rights Reserved. 20
Project Jigsaw 変更
Project Jigsaw
長い Copyright©2015 NTT corp. All Rights Reserved. 21
Backgrounds • JAR Hell
Hadoop 様子
Copyright©2015 NTT corp. All Rights Reserved. 22
Backgrounds • JAR Hell
会場:(笑) 某Hadoopコ :(戦慄)
Copyright©2015 NTT corp. All Rights Reserved. 23
Backgrounds • JAR Hell 課題 –紛失 ? –コン 生? –内部 API 全 変更 ?
• JAR 抽象化機構 必要 –Module 導入
化 JDK 解決
Copyright©2015 NTT corp. All Rights Reserved. 24
Module
• Package コン –Module •Package(s) –Class(es) & Interface(s)
»Field(s) & Method(s) ー ー ン 作
Copyright©2015 NTT corp. All Rights Reserved. 25
Module
•新 コン 各コン ( ー ) •依 関係 明確化 •他コン 妨 い •特定 ー 公開
風 い い
Copyright©2015 NTT corp. All Rights Reserved. 26
大雑把 ー • Before
依 関係 明確 Copyright©2015 NTT corp. All Rights Reserved. 27
a.jar
d.jar c.jar
b.jar
?
• After
mod a
mod d mod c
mod b
$ java –mp mod_dir \ mymod.Main
$ java –cp a.jar:\ b.jar:c.jar:d.jar \ myapp.Main
実際 ー 作成方法 追 行 う Copyright©2015 NTT corp. All Rights Reserved. 28
ー 作成
ー 作 Copyright©2015 NTT corp. All Rights Reserved. 29
com.foo.bar
ー い い Copyright©2015 NTT corp. All Rights Reserved. 30
com.foo.bar
com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
ー い い Copyright©2015 NTT corp. All Rights Reserved. 31
com.foo.bar
com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
module-info.java src ベ Copyright©2015 NTT corp. All Rights Reserved. 32
com.foo.bar
com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
ー 情報 言 Copyright©2015 NTT corp. All Rights Reserved. 33
com.foo.bar
module com.foo.bar { }
com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
ー 簡易 表現 Copyright©2015 NTT corp. All Rights Reserved. 34
module com.foo.bar { }
com.foo.bar
実装 依 ー 2 追加 ※ java.* JDK ー 表
Copyright©2015 NTT corp. All Rights Reserved. 35
module com.foo.bar { }
java.sql
com.foo.bar
com.foo.baz
依 ー う 定義 Copyright©2015 NTT corp. All Rights Reserved. 36
module com.foo.bar { requires com.foo.baz; requires java.sql; }
java.sql
com.foo.bar
com.foo.baz
Copyright©2015 NTT corp. All Rights Reserved. 37
うい 依 関係 場合
module com.foo.bar { requires java.sql; requires java.logging; : } com.foo.bar
java.sql
java.logging
module java.sql { : requires java.logging; : }
Copyright©2015 NTT corp. All Rights Reserved. 38
module java.sql { : requires public java.logging; : }
う 定義 requires 依 可能 (暗黙 可読性)
module com.foo.bar { requires java.sql; : }
reads
com.foo.bar
java.sql
java.logging ※: java.sql 通 定義さ
依 ー 定義 Copyright©2015 NTT corp. All Rights Reserved. 39
module com.foo.bar { requires com.foo.baz; requires java.sql; }
com.foo.baz java.sql
java.logging
com.foo.bar
Copyright©2015 NTT corp. All Rights Reserved. 40
com.foo.bar
次 ー 内 あ ー 注目
com.foo.internal com.foo.bar.alpha com.foo.bar.beta
module com.foo.bar { requires com.foo.baz; requires java.sql; }
java.logging
com.foo.baz java.sql
Copyright©2015 NTT corp. All Rights Reserved. 41
com.foo.bar
com.foo.internal com.foo.bar.alpha com.foo.bar.beta
内部 API 変更時 影響 抑え 他 ー 公開 くあ せ
module com.foo.bar { requires com.foo.baz; requires java.sql; }
java.logging
com.foo.baz java.sql
Copyright©2015 NTT corp. All Rights Reserved. 42
com.foo.bar
java.sql
com.foo.internal com.foo.bar.alpha com.foo.bar.beta
module com.foo.bar { requires com.foo.baz; requires java.sql; exports com.foo.bar.alpha; exports com.foo.bar.beta; }
他 ー 公開 ー(exports) そ 情報 定義
java.logging
com.foo.baz
Copyright©2015 NTT corp. All Rights Reserved. 43
module com.foo.bar { requires com.foo.baz; requires java.sql; exports com.foo.bar.alpha; exports com.foo.bar.beta; }
exports 含 い い場合 public あ 他 ー 参照 せ
com.foo.internal com.foo.bar.alpha com.foo.bar.beta
reads reads
com.foo.bar
com.foo.app
Copyright©2015 NTT corp. All Rights Reserved. 44
module com.foo.bar { requires com.foo.baz; requires java.sql; exports com.foo.bar.alpha to com.foo.app, com.foo.xxx; exports com.foo.bar.beta to com.foo.app, com.foo.xxx; }
com.foo.internal com.foo.bar.alpha com.foo.bar.beta
reads
com.foo.zzz
reads
com.foo.bar
exports 先 ー 限定
com.foo.app
Accessibility –public –protected –<package> –private
従来 セ 制限 考え方 う Copyright©2015 NTT corp. All Rights Reserved. 45
Accessibility –public to everyone –public but only to specific modules –public only within a module –protected –<package> –private
JDK9 public 範 指定可能 !
Copyright©2015 NTT corp. All Rights Reserved. 46
exports p;
exports p to m;
exports
Services • java.util.ServiceLoader
META-INF/services/* 変更 形
Copyright©2015 NTT corp. All Rights Reserved. 47
module com.mysql.jdbc { requires java.sql; exports com.mysql.jdbc; provides java.sql.Driver with com.mysql.jdbc.Driver; }
module java.sql { : exports javax.transaction.xa; uses java.sql.Driver; }
JDK Module 化
JDK ー 化 脱 Copyright©2015 NTT corp. All Rights Reserved. 48
http://openjdk.java.net/jeps/200
JDK (API) Module 化
ー ー 化 完了 Copyright©2015 NTT corp. All Rights Reserved. 49
http://openjdk.java.net/projects/jigsaw/j1/intro-modular-dev-j1-2015.pdf P.19
ー ン情報 • -listmods
全部 9.0
Copyright©2015 NTT corp. All Rights Reserved. 50
$ jdk1.9.0-ea/bin/java -listmods
[email protected] [email protected] [email protected] [email protected] :
Java 界 的 Copyright©2015 NTT corp. All Rights Reserved. 51
ー 世代 実行方法
コン • -d <Directory>
com.foo.app ー さえ
Copyright©2015 NTT corp. All Rights Reserved. 52
$ javac –d mods/com.foo.app \ src/com.foo.app/module-info.java \ src/com.foo.app/com/foo/app/Main.java \ :
src `-- com.foo.app |-- com | `-- foo | `-- app | `-- Main.java `-- module-info.java
mods `-- com.foo.app |-- com | `-- foo | `-- app | `-- Main.class `-- module-info.class
依 module 参照 • -modulepath mod1:mod2 …
classpath 使用感 -mp OK
Copyright©2015 NTT corp. All Rights Reserved. 53
$ java(c) –modulepath dir :dir :dir …
依 付 コン • -mp <mods> -d <Directory>
-d 依 有無関係 く必要
Copyright©2015 NTT corp. All Rights Reserved. 54
$ javac –mp mods –d mods/com.foo.bar \ src/com.foo.bar/module-info.java \ src/com.foo.bar/com/foo/bar/alpha/… :
src/com.foo.bar/module-info.java src/com.foo.bar/com/foo/bar/alpha/Alpha.java : mods/com.foo.bar/module-info.class mods/com.foo.bar/com/foo/bar/alpha/Alpha.class :
複数 ー 時コン • -modulesourcepath <src>
-d 指定先 自動生成
Copyright©2015 NTT corp. All Rights Reserved. 55
$ javac -modulesourcepath src -d mods \ src/com.foo.bar/module-info.java \ src/com.foo.bar/com/foo/bar/alpha/… :
mods/com.foo.bar/module-info.class mods/com.foo.bar/com/foo/bar/alpha/Alpha.class : mods/com.foo.othermodule/module-info.class mods/com.foo.othermodule/com/foo/othermodule/… :
実行 • -m <module>/<main-class>
そ 実行 -m 新 く必要
Copyright©2015 NTT corp. All Rights Reserved. 56
$ java –mp mods \ –m com.foo.app/com.foo.app.Main
Hello world from module com.foo.app!
module name main class
依 ー 確認 • -Xdiag:resolver
各 ー 間 依 関係 解
Copyright©2015 NTT corp. All Rights Reserved. 57
$ java –Xdiag:resolver –mp mods \ –m com.foo.app/com.foo.app.Main [Resolve] Root module com.foo.app located [Resolve] (file:///ykubota/mods/com.foo.app/) [Resolve] Module java.base located, required by com.foo.app [Resolve] (jrt:/java.base) : (依 ー 全部読込 要求 ー 共 出力) [Resolve] Resolve completed [Resolve] com.foo.app [Resolve] java.base : (読込 ー ) Hello world from module com.foo.app!
modular JAR 作 方 • -C <path/to/module>
--module-version ー ン 入力可能
Copyright©2015 NTT corp. All Rights Reserved. 58
$ jar –-create –-file mlib/app.jar \ --main-class com.foo.app.Main \ -C mods/com.foo.app .
module-info.class com/foo/app/Main.class :
app.jar
modular JAR 確認 • --print-module-descriptor (-p)
java.base 基底 ー = MANDATED
Copyright©2015 NTT corp. All Rights Reserved. 59
$ jar -p –-file mlib/app.jar
Name: com.foo.app Requires: java.base [ MANDATED ] : Main class: com.foo.app.Main
modular JAR 実行 • -mp <path/to/jar>
Copyright©2015 NTT corp. All Rights Reserved. 60
$ java –mp mlib –m com.foo.app
Hello world from module com.foo.app!
jar 生成時 ン 指定 -m ン 不要
classpath modular jar • -cp <path/to/jar>
Copyright©2015 NTT corp. All Rights Reserved. 61
$ java -cp mlib/app.jar com.foo.app.Main
Hello world from module com.foo.app!
後方互換性 あ java -jar app.jar OK
別 jar 依 あ 場合 • bar.jar 必要 ー 想定
bar.jar 含 必要 ー
Copyright©2015 NTT corp. All Rights Reserved. 62
Exception in thread "main" java.lang.NoClassDefFoundError: com/foo/bar/Something at com.foo.app.Main.main(Main.java:8) Caused by: java.lang.ClassNotFoundException: com.foo.bar.Something at jdk.internal.misc.BuiltinClassLoader.loadClass([email protected]/BuiltinClassLoader.java:368) at jdk.internal.misc.ClassLoaders$AppClassLoader.loadClass([email protected]/ClassLoaders.java:167) at java.lang.ClassLoader.loadClass([email protected]/ClassLoader.java:373) ... 1 more
$ java -cp mlib/app.jar com.foo.app.Main
別 jar 依 あ 場合 • ー 非対応 JAR 場合
Copyright©2015 NTT corp. All Rights Reserved. 63
$ java -cp /path/to/bar.jar:mlib/app.jar \ com.foo.app.Main
Hello world from module com.foo.app!
後方互換性 あ ー 対応 JAR 場合 方法 利用可能
別 jar 依 あ 場合 • ー 対応 JAR 場合
Copyright©2015 NTT corp. All Rights Reserved. 64
$ java -mp /directory/of/bar.jar/ \ –addmods com.foo.bar \ -cp mlib/app.jar com.foo.app.Main
Hello world from module com.foo.app!
-mp 指定 場合 addmods 必要 -mp く 指定
別 jar 依 あ 場合 •
Copyright©2015 NTT corp. All Rights Reserved. 65
$ java -mp <Modular JAR > \ -cp <Modular 非対応 JAR 列挙> \ -m com.foo.app
Hello world from module com.foo.app!
個人的
実行可能 ー 作成 • Linking
組 込 やセキ 活躍 ?
Copyright©2015 NTT corp. All Rights Reserved. 66
$ jlink --modulepath $JDKMODS \ --addmods java.base --output myimage
$ myimage/bin/java –listmods [email protected]
※:JDKMODS = $JAVA_HOME(jdk9)/jmods/
Linking • jlink
時代 java ー 乱立 恐怖
Copyright©2015 NTT corp. All Rights Reserved. 67
$ jlink --modulepath $JDKMODS:mlib \ --addmods com.foo.app --output myimage
$ myimage/bin/java –listmods [email protected] [email protected] : com.foo.bar com.foo.app
Linking (実行) • jlink
組 込 -mp 不要
Copyright©2015 NTT corp. All Rights Reserved. 68
$ myimage/bin/java -m com.foo.app $ myimage/bin/com.foo.app
Hello world from module com.foo.app!
myimage/ |-- bin | |-- com.foo.app | |-- java : `-- keytool
一例 紹 Copyright©2015 NTT corp. All Rights Reserved. 69
自作 ー 対応
ン ーン • ン
更 橙=普通 jar, 青=module
Copyright©2015 NTT corp. All Rights Reserved. 70
myapp.jar mylib.jar
external-core-1.2.3.jar external-lib-1.2.3.jar
java.base java.logging java.sql
依 確認 • jdeps
依 置い 実行
Copyright©2015 NTT corp. All Rights Reserved. 71
$ jdeps –s lib/myapp.jar lib/mylib.jar
myapp.jar -> lib/external-core-1.2.3.jar myapp.jar -> lib/external-lib-1.2.3.jar myapp.jar -> mylib.jar myapp.jar -> java.base mylib.jar -> java.base
自作 ー 化 • mylib
mylib myapp 限定 変更 容易
Copyright©2015 NTT corp. All Rights Reserved. 72
module mylib { requires java.base; exports com.myapp.lib to myapp; }
自作 ー 化 • myapp
外部 ー 様 定義
Copyright©2015 NTT corp. All Rights Reserved. 73
module myapp { requires mylib; requires java.base; requires external.core; requires external.lib; }
Automatic modules
–JAR 変更 必要 –JAR ー生成さ
–全 ー exports –他 全 ー requires
可能性 あ 全部舐 う Copyright©2015 NTT corp. All Rights Reserved. 74
requires external.core; requires external.lib;
情報 自動生成 • jdeps -genmoduleinfo
全 ー exports 要修
Copyright©2015 NTT corp. All Rights Reserved. 75
Writing to src/mylib/module-info.java Writing to src/myapp/module-info.java Writing to src/external-core/module-… Writing to src/external-lib/module-…
$ jdeps –genmoduleinfo src libs/*.jar
終的 結果
作成 部分 Copyright©2015 NTT corp. All Rights Reserved. 76
external.core external.lib
java.base java.logging java.se
myapp mylib
終的 結果
外部 依 関係 必要過多状態 Copyright©2015 NTT corp. All Rights Reserved. 77
external.core external.lib
java.base java.logging java.se
myapp mylib
コン •配置
•コン
や 集大成 Copyright©2015 NTT corp. All Rights Reserved. 78
./lib/external*.jar
./src/myapp/module-info.java
./src/myapp/… <Java files>
./src/mylib/… <Java files>
$ javac -modulesourcepath src –mp lib –d mods ./src/… $ jar --create --file mlib/mylib.jar –C mods/mylib . $ jar --create --file mlib/myapp.jar –C mods/myapp . \ --main-class myapp.Main
実行 before/after • Before
• After
Copyright©2015 NTT corp. All Rights Reserved. 79
$ java –cp lib/myapp.jar:lib/mylib.jar:\ lib/external-core-1.2.3.jar:\ lib/external-lib-1.2.3.jar \ myapp.Main
$ java –mp mlib:lib –m myapp
End
Copyright©2015 NTT corp. All Rights Reserved. 80
Jigsaw 考え方
出展: http://openjdk.java.net/projects/jigsaw/j1/jigsaw-under-the-hood-j1-2015.pdf P.58
End
Copyright©2015 NTT corp. All Rights Reserved. 81
Reference
openjdk.java.net/projects/jigsaw/
End
い Copyright©2015 NTT corp. All Rights Reserved. 82