Slide 1

Slide 1 text

Fujitsu Restricted 失敗しない OpenJDKの非互換調査 2024/10/27 田端 大志 © 2024 Fujitsu Limited JJUG CCC 2024 Fall @tbtdis

Slide 2

Slide 2 text

Javaバージョンアップ時の行動 Javaの互換性 CSR Groupの活動 CSRを用いた非互換調査 アジェンダ

Slide 3

Slide 3 text

© 2024 Fujitsu Limited ●アプリケーションサーバー製品の開発・保守 ●OpenJDK関連のコミュニティ活動 自己紹介 3 JJUG初登壇よろしくお願いします! 富士通株式会社 社会人2年目 田端 大志 (Tabata, Daishi) ●近況 ●GeoGuessrにドハマり中 ●河村選手の大活躍をみてNBAに興味あり

Slide 4

Slide 4 text

Javaバージョンアップ時の行動 Javaの互換性 CSR Groupの活動 CSRを用いた非互換調査 アジェンダ

Slide 5

Slide 5 text

© 2024 Fujitsu Limited Javaバージョンアップ時の行動 5 ドキュメント調査 リリースノートや移行ガイドなどを読む 依存ライブラリの調査 新しいJavaにライブラリが対応しているか プログラムの修正 非互換対応、および新機能を使ったソースに変更 各種テストの実行 新しいJavaでにアプリが期待通りに動作するか

Slide 6

Slide 6 text

© 2024 Fujitsu Limited Javaバージョンアップ時の行動 6 ドキュメント調査 リリースノートや移行ガイドなどを読む 依存ライブラリの調査 新しいJavaにライブラリが対応しているか プログラムの修正 非互換対応、および新機能を使ったソースに変更 各種テストの実行 新しいJavaでにアプリが期待通りに動作するか

Slide 7

Slide 7 text

© 2024 Fujitsu Limited ドキュメント調査 各ベンダーが自分たちの方針で 発行しているドキュメント 7 ✓非推奨化された機能 ✓削除された機能 ✓追加された機能 ✓バグ修正 ✓セキュリティの改善 リリースノート 移行ガイド ※名前はベンダーによる

Slide 8

Slide 8 text

© 2024 Fujitsu Limited ドキュメント調査 各ベンダーが自分たちの方針で 発行しているドキュメント OpenJDKの変更が網羅的に記載されていない可能性 8 ✓非推奨化された機能 ✓削除された機能 ✓追加された機能 ✓バグ修正 ✓セキュリティの改善 リリースノート 移行ガイド ※名前はベンダーによる

Slide 9

Slide 9 text

© 2024 Fujitsu Limited 失敗例 9 ベンダー JDK 17 ドキュメント方針:機能の削除、追加のみ記載 Thread.stop() アプリ 自社 JDK17からJDK21に移行 提供 JDK 21

Slide 10

Slide 10 text

© 2024 Fujitsu Limited 失敗例 10 ベンダー JDK 17 ドキュメント方針:機能の削除、追加のみ記載 Thread.stop() アプリ 自社 JDK17からJDK21に移行 常にExceptionをスロー (OpenJDK20~) 提供 ベンダー発行のドキュメントを 読むだけでは気づけない JDK 21

Slide 11

Slide 11 text

Javaバージョンアップ時の行動 Javaの互換性 CSR Groupの活動 CSRを用いた非互換調査 アジェンダ

Slide 12

Slide 12 text

© 2024 Fujitsu Limited 互換性分類 12 ベンダー互換性 バージョン間互換性 本日のテーマ はこちら OracleJDK、Temurin、・・・ JDK11、JDK17、JDK21、・・・ プラットフォーム互換性 Windows、Linux、Android、・・・ 互換性

Slide 13

Slide 13 text

© 2024 Fujitsu Limited Javaの「互換性」の定義 参考 https://wiki.openjdk.org/display/csr/Kinds+of+Compatibility 13 ソース互換(Source Compatibility) バイナリ互換(Binary Compatibility) ふるまい互換(Behavioral Compatibility) Javaはほかのプログラミング言語と比較して バージョン間の互換性維持を非常に重要視 しかし、非互換がまったくないわけではない 互換性 定義 非互換を厳密に管理している

Slide 14

Slide 14 text

© 2024 Fujitsu Limited ⚫Javaソースがクラスファイルに変換される過程の互換性 ① 既存のコードはコンパイルできること ② 1が満たし、クラスファイル内のすべてのバイナリ名が同じであること ③ 2が満たさない場合、クラスファイルのふるまいは同じであること ソース互換(Source Compatibility) public double foo(double d) { return d * 2.0; } foo(4)を呼び出す 旧版:foo(double) ⇒ return 8.0 新版:foo(int) ⇒ return 8.0 バイナリ名が異なる = 2を満たさない 呼び出し結果は同じ = 3を満たす // New overloading public double foo(int i) { return i * 2.0; } 新バージョンで追加 14 互換なし

Slide 15

Slide 15 text

© 2024 Fujitsu Limited ⚫Javaソースがクラスファイルに変換される過程の互換性 ① 既存のコードはコンパイルできること ② 1が満たし、クラスファイル内のすべてのバイナリ名が同じであること ③ 2が満たさない場合、クラスファイルのふるまいは同じであること ソース互換(Source Compatibility) public double foo(double d) { return d * 2.0; } // New overloading public double foo(int i) { return i * 2.0 4.0; } 新バージョンで追加 foo(4)を呼び出す 旧版:foo(double) ⇒ return 8.0 新版:foo(int) ⇒ return 16.0 バイナリ名が異なる = 2を満たさない 呼び出し結果が異なる= 3を満たさない 15 互換なし

Slide 16

Slide 16 text

© 2024 Fujitsu Limited ●既存のバイナリがエラーなくリンクできること ●Java言語仕様で定義されている(JLS Chapter 13) バイナリ互換(Binary Compatibility) Compiler.enable(); JDK21で削除されるAPI JDK17のjavacでコンパイル X.class JDK17のjavaで実行 ⇒ OK JDK21のjavaで実行 ⇒ NG java.lang.NoClassDefFoundError: java/lang/Compiler 16 既存のバイナリ 互換なし

Slide 17

Slide 17 text

© 2024 Fujitsu Limited ●同じ入力であれば同じ結果になること ふるまい互換(Behavioral Compatibility) public int bar(int i) { return i * 2; } 新バージョンで変更 public int bar(int i) { return i * 4; } bar(4)を呼び出す 旧版:foo(int) ⇒ return 8 新版:foo(int) ⇒ return 16 同じ入力で異なる結果 = ふるまい互換を満たさない 17 互換なし

Slide 18

Slide 18 text

© 2024 Fujitsu Limited ●同じ入力であれば同じ結果になること ●スレッドAとスレッドBのどちらが先に終了するか判定 ふるまい互換(Behavioral Compatibility) タイミングに依存する"ふるまい"はふるまい互換の対象外 スレッドA スレッドB スレッドA スレッドB 先 先 後 後 旧バージョン 新バージョン 18

Slide 19

Slide 19 text

© 2024 Fujitsu Limited 3つの互換性のいずれか、または複数を満たさない Javaの非互換管理方法 19 非互換 Q. 非互換を取り込むことをだれが承認している? A. CSR Group 判断基準 判断できたとしてもなんでも取り込んでも良いわけではない

Slide 20

Slide 20 text

Javaバージョンアップ時の行動 Javaの互換性 CSR Groupの活動 CSRを用いた非互換調査 アジェンダ

Slide 21

Slide 21 text

© 2024 Fujitsu Limited ●CSR = Compatibility and Specification Review 直訳:互換性と仕様のレビュー ●JDK Release Projectに提案されたJDKとJDKユーザ間の インターフェースの変更をレビューする権限をもつ組織 ※インターフェース = API、JDKツール、ログ形式など ●構成員 ●Lead:Joe Darcy “Java Floating-Point Czar”「Java浮動小数点の皇帝」 ●Member:6名(ほぼ全員が他プロジェクトのリードレベル) CSR Groupとは 21 参考 https://openjdk.org/census#csr https://inside.java/u/JoeDarcy

Slide 22

Slide 22 text

© 2024 Fujitsu Limited ●十分な理由がない限り、バイナリ非互換を発生させない ●ソース非互換は避ける ●ふるまい非互換はマネジメントする CSRの互換性ポリシー 22 ポリシーの下でレビューを実施することでバランス保っている イノベーション 互換性の維持

Slide 23

Slide 23 text

Javaバージョンアップ時の行動 Javaの互換性 CSR Groupの活動 CSRを用いた非互換調査 アジェンダ

Slide 24

Slide 24 text

© 2024 Fujitsu Limited 失敗例 24 ベンダー JDK 17 ドキュメント方針:機能の削除、追加、非推奨化のみ記載 Thread.stop() アプリ 自社 JDK17からJDK21に移行 常にExceptionをスロー (OpenJDK20~) 提供 ベンダー発行のドキュメントを 読むだけでは気づけない JDK 21

Slide 25

Slide 25 text

© 2024 Fujitsu Limited 失敗例 25 ベンダー JDK 17 ドキュメント方針:機能の削除、追加、非推奨化のみ記載 Thread.stop() アプリ 自社 JDK17からJDK21に移行 常にExceptionをスロー (OpenJDK20~) 提供 ベンダー発行のドキュメントを 読むだけでは気づけない JDK 21 失敗しないために どうすればいい?

Slide 26

Slide 26 text

© 2024 Fujitsu Limited ●CSR Groupが変更をレビューするときに使うドキュメント ●JDK Bug Systemで管理されている CSRドキュメント 26 限りある工数のなかですべてを読むことはできない 自分たちのアプリに影響がありそうなものを優先して確認したい ベンダーの主観なく網羅的に調査することができる 各バージョン間で100件以上と件数が多い 例:JDK17 → JDK21で634件

Slide 27

Slide 27 text

© 2024 Fujitsu Limited デモ 27 実際のCSRドキュメントを見ながら 優先度決めの考え方をご紹介します https://bugs.openjdk.org/secure/Dashboard.jspa

Slide 28

Slide 28 text

サマリ OpenJDKはCSR Groupによる互換審議プロセスによって イノベーションと互換性維持のバランスを保っている ベンダー発行のドキュメントにはバイアスがかかっている可能性 フラットな視点で非互換調査をするにはCSRドキュメントが有効 CSRドキュメントは数が多くすべてを読むことは困難 JDK Bug Systemの検索機能を活用して優先度をつける

Slide 29

Slide 29 text

© 2024 Fujitsu Limited © 2024 Fujitsu Limited Thank you