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 javacRead-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.jarc.jar
b.jar
?
• After
mod a
mod dmod 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
java.activation@9.0
java.annotations.common@9.0
java.base@9.0
java.compact1@9.0
:
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(java.base@9.0/BuiltinClassLoader.java:368)
at
jdk.internal.misc.ClassLoaders$AppClassLoader.loadClass(java.base@9.0/ClassLoaders.java:167)
at java.lang.ClassLoader.loadClass(java.base@9.0/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
java.base@9.0
※: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
java.base@9.0
java.logging@9.0
:
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

JavaOne 2015 JDK Update (Jigsaw) #j1jp

  • 1.
    JDK Update KUBOTA Yuji @sugarlife NTTOSSセン JavaOne 2015 報告会@東京 Copyright©2015 NTT corp. All Rights Reserved.
  • 2.
    Glossary • Java SE –Oracle提供 い JRE, JDK • JDK –Java Developer Kit – Oracle 提供 い 限 い (例:OpenJDK) 本 JDK 表現 Copyright©2015 NTT corp. All Rights Reserved. 2
  • 3.
    KUBOTA Yuji @sugarlife •OpenJDK ー –コ 解析 GC ー ン , etc… • 解析支援 ー HeapStats 開 –多数 商用 元気 稼働中 :) • 難聴者 –資料的 多用 写真 人 セン 凄い 実感中 Copyright©2015 NTT corp. All Rights Reserved. 3
  • 4.
    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
  • 5.
    Why JavaOne ? 結婚式ー 活躍 Copyright©2015 NTT corp. All Rights Reserved. 5
  • 6.
    •課題:Java 進化方向 •人物:誰 何担当 •詳細:技術内容や事例 JavaOne 行 何 見聞 個人的 重要 ン Copyright©2015 NTT corp. All Rights Reserved. 6
  • 7.
    現在 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
  • 8.
    何 大 く変わ? • 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
  • 9.
    JDK 9 = Project Jigsaw ProjectJigsaw JVM 変更(影響)範 多岐 渡 得 い面 あ そ 以外 + Copyright©2015 NTT corp. All Rights Reserved. 9
  • 10.
    Project Jigsaw 以外 変更 ProjectJigsaw 長い 後回 Copyright©2015 NTT corp. All Rights Reserved. 10
  • 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 ー 関わ 言語や ー 変更点 Copyright©2015 NTT corp. All Rights Reserved. 11
  • 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 javacRead-Eval-Print-Loop Java 場 Good-bye {Sample,Example,Test}.java Copyright©2015 NTT corp. All Rights Reserved. 12
  • 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 検索機能追加, HTML5対応, Doclet 改善, 等 Copyright©2015 NTT corp. All Rights Reserved. 13
  • 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 javac 古い ー ン N 合わせ 場合 -source N -target N 他 -bootclasspath jdkN/lib/rt.jar 必要 -release N 後 過去 3 ー ン 対応(9 6) Copyright©2015 NTT corp. All Rights Reserved. 14
  • 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“_” 命 禁 , private interface methods, 匿 ン 対応, 等 Copyright©2015 NTT corp. All Rights Reserved. 15
  • 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 jdk javac lint warnings 0 Copyright©2015 NTT corp. All Rights Reserved. 16
  • 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 超要約 Diamond Nest祭 く Copyright©2015 NTT corp. All Rights Reserved. 17
  • 18.
    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
  • 19.
    非互換 変更点 • Newversion-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
  • 20.
    非互換 変更点 • Newversion-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 変更
  • 21.
    Project Jigsaw 長い Copyright©2015 NTTcorp. All Rights Reserved. 21
  • 22.
    Backgrounds • JAR Hell Hadoop様子 Copyright©2015 NTT corp. All Rights Reserved. 22
  • 23.
    Backgrounds • JAR Hell 会場:(笑)某Hadoopコ :(戦慄) Copyright©2015 NTT corp. All Rights Reserved. 23
  • 24.
    Backgrounds • JAR Hell課題 –紛失 ? –コン 生? –内部 API 全 変更 ? • JAR 抽象化機構 必要 –Module 導入 化 JDK 解決 Copyright©2015 NTT corp. All Rights Reserved. 24
  • 25.
    Module • Package コン –Module •Package(s) –Class(es)& Interface(s) »Field(s) & Method(s) ー ー ン 作 Copyright©2015 NTT corp. All Rights Reserved. 25
  • 26.
    Module • 新 コン 各コン( ー ) •依 関係 明確化 •他コン 妨 い •特定 ー 公開 風 い い Copyright©2015 NTT corp. All Rights Reserved. 26
  • 27.
    大雑把 ー • Before 依関係 明確 Copyright©2015 NTT corp. All Rights Reserved. 27 a.jar d.jarc.jar b.jar ? • After mod a mod dmod c mod b $ java –mp mod_dir mymod.Main $ java –cp a.jar: b.jar:c.jar:d.jar myapp.Main
  • 28.
    実際 ー 作成方法追 行 う Copyright©2015 NTT corp. All Rights Reserved. 28 ー 作成
  • 29.
    ー 作 Copyright©2015 NTTcorp. All Rights Reserved. 29 com.foo.bar
  • 30.
    ー い い Copyright©2015NTT corp. All Rights Reserved. 30 com.foo.bar com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
  • 31.
    ー い い Copyright©2015NTT corp. All Rights Reserved. 31 com.foo.bar com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
  • 32.
    module-info.java src ベ Copyright©2015NTT corp. All Rights Reserved. 32 com.foo.bar com.foo.bar.alpha.Alpha com.foo.bar.beta.Beta com.foo.internal.Internal :
  • 33.
    ー 情報 言 Copyright©2015NTT 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 :
  • 34.
    ー 簡易 表現 Copyright©2015NTT corp. All Rights Reserved. 34 module com.foo.bar { } com.foo.bar
  • 35.
    実装 依 ー2 追加 ※ java.* JDK ー 表 Copyright©2015 NTT corp. All Rights Reserved. 35 module com.foo.bar { } java.sql com.foo.bar com.foo.baz
  • 36.
    依 ー う定義 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
  • 37.
    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; : }
  • 38.
    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 通 定義さ
  • 39.
    依 ー 定義 Copyright©2015NTT 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
  • 40.
    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
  • 41.
    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
  • 42.
    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
  • 43.
    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
  • 44.
    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
  • 45.
    Accessibility –public –protected –<package> –private 従来 セ 制限考え方 う Copyright©2015 NTT corp. All Rights Reserved. 45
  • 46.
    Accessibility –public to everyone –publicbut 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
  • 47.
    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; }
  • 48.
    JDK Module 化 JDKー 化 脱 Copyright©2015 NTT corp. All Rights Reserved. 48 http://openjdk.java.net/jeps/200
  • 49.
    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
  • 50.
    ー ン情報 • -listmods 全部9.0 Copyright©2015 NTT corp. All Rights Reserved. 50 $ jdk1.9.0-ea/bin/java -listmods java.activation@9.0 java.annotations.common@9.0 java.base@9.0 java.compact1@9.0 :
  • 51.
    Java 界 的 Copyright©2015NTT corp. All Rights Reserved. 51 ー 世代 実行方法
  • 52.
    コン • -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
  • 53.
    依 module 参照 •-modulepath mod1:mod2 … classpath 使用感 -mp OK Copyright©2015 NTT corp. All Rights Reserved. 53 $ java(c) –modulepath dir :dir :dir …
  • 54.
    依 付 コン •-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 :
  • 55.
    複数 ー 時コン •-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/… :
  • 56.
    実行 • -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
  • 57.
    依 ー 確認 •-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!
  • 58.
    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
  • 59.
    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
  • 60.
    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 ン 不要
  • 61.
    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
  • 62.
    別 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(java.base@9.0/BuiltinClassLoader.java:368) at jdk.internal.misc.ClassLoaders$AppClassLoader.loadClass(java.base@9.0/ClassLoaders.java:167) at java.lang.ClassLoader.loadClass(java.base@9.0/ClassLoader.java:373) ... 1 more $ java -cp mlib/app.jar com.foo.app.Main
  • 63.
    別 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 場合 方法 利用可能
  • 64.
    別 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 く 指定
  • 65.
    別 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! 個人的
  • 66.
    実行可能 ー 作成 •Linking 組 込 やセキ 活躍 ? Copyright©2015 NTT corp. All Rights Reserved. 66 $ jlink --modulepath $JDKMODS --addmods java.base --output myimage $ myimage/bin/java –listmods java.base@9.0 ※:JDKMODS = $JAVA_HOME(jdk9)/jmods/
  • 67.
    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 java.base@9.0 java.logging@9.0 : com.foo.bar com.foo.app
  • 68.
    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
  • 69.
    一例 紹 Copyright©2015 NTTcorp. All Rights Reserved. 69 自作 ー 対応
  • 70.
    ン ーン • ン 更橙=普通 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
  • 71.
    依 確認 • 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
  • 72.
    自作 ー 化 •mylib mylib myapp 限定 変更 容易 Copyright©2015 NTT corp. All Rights Reserved. 72 module mylib { requires java.base; exports com.myapp.lib to myapp; }
  • 73.
    自作 ー 化 •myapp 外部 ー 様 定義 Copyright©2015 NTT corp. All Rights Reserved. 73 module myapp { requires mylib; requires java.base; requires external.core; requires external.lib; }
  • 74.
    Automatic modules –JAR 変更必要 –JAR ー 生成さ –全 ー exports –他 全 ー requires 可能性 あ 全部舐 う Copyright©2015 NTT corp. All Rights Reserved. 74 requires external.core; requires external.lib;
  • 75.
    情報 自動生成 • 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
  • 76.
    最終的 結果 作成 部分 Copyright©2015NTT corp. All Rights Reserved. 76 external.core external.lib java.base java.logging java.se myapp mylib
  • 77.
    最終的 結果 外部 依関係 必要過多状態 Copyright©2015 NTT corp. All Rights Reserved. 77 external.core external.lib java.base java.logging java.se myapp mylib
  • 78.
    コン • 配置 • コン や集大成 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
  • 79.
    実行 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
  • 80.
    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
  • 81.
    End Copyright©2015 NTT corp.All Rights Reserved. 81 Reference openjdk.java.net/ projects/jigsaw/
  • 82.
    End い Copyright©2015 NTT corp.All Rights Reserved. 82