Upgrade to Pro — share decks privately, control downloads, hide ads and more …

失敗しないOpenJDKの非互換調査

 失敗しないOpenJDKの非互換調査

JJUG CCC 2024 Fall

Daishi Tabata

October 27, 2024
Tweet

Other Decks in Technology

Transcript

  1. © 2024 Fujitsu Limited •アプリケーションサーバー製品の開発・保守 •OpenJDK関連のコミュニティ活動 自己紹介 3 JJUG初登壇よろしくお願いします! 富士通株式会社

    社会人2年目 田端 大志 (Tabata, Daishi) •近況 •GeoGuessrにドハマり中 •河村選手の大活躍をみてNBAに興味あり
  2. © 2024 Fujitsu Limited Javaバージョンアップ時の行動 5 ドキュメント調査 リリースノートや移行ガイドなどを読む 依存ライブラリの調査 新しいJavaにライブラリが対応しているか

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

    プログラムの修正 非互換対応、および新機能を使ったソースに変更 各種テストの実行 新しいJavaでにアプリが期待通りに動作するか
  4. © 2024 Fujitsu Limited ドキュメント調査 各ベンダーが自分たちの方針で 発行しているドキュメント 7 ✓非推奨化された機能 ✓削除された機能

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

    ✓削除された機能 ✓追加された機能 ✓バグ修正 ✓セキュリティの改善 リリースノート 移行ガイド ※名前はベンダーによる
  6. © 2024 Fujitsu Limited 失敗例 10 ベンダー JDK 17 ドキュメント方針:機能の削除、追加のみ記載

    Thread.stop() アプリ 自社 JDK17からJDK21に移行 常にExceptionをスロー (OpenJDK20~) 提供 ベンダー発行のドキュメントを 読むだけでは気づけない JDK 21
  7. © 2024 Fujitsu Limited 互換性分類 12 ベンダー互換性 バージョン間互換性 本日のテーマ はこちら

    OracleJDK、Temurin、・・・ JDK11、JDK17、JDK21、・・・ プラットフォーム互換性 Windows、Linux、Android、・・・ 互換性
  8. © 2024 Fujitsu Limited Javaの「互換性」の定義 参考 https://wiki.openjdk.org/display/csr/Kinds+of+Compatibility 13 ソース互換(Source Compatibility)

    バイナリ互換(Binary Compatibility) ふるまい互換(Behavioral Compatibility) Javaはほかのプログラミング言語と比較して バージョン間の互換性維持を非常に重要視 しかし、非互換がまったくないわけではない 互換性 定義 非互換を厳密に管理している
  9. © 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 互換なし
  10. © 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 互換なし
  11. © 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 既存のバイナリ 互換なし
  12. © 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 互換なし
  13. © 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
  14. © 2024 Fujitsu Limited 失敗例 24 ベンダー JDK 17 ドキュメント方針:機能の削除、追加、非推奨化のみ記載

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

    Thread.stop() アプリ 自社 JDK17からJDK21に移行 常にExceptionをスロー (OpenJDK20~) 提供 ベンダー発行のドキュメントを 読むだけでは気づけない JDK 21 失敗しないために どうすればいい?
  16. © 2024 Fujitsu Limited •CSR Groupが変更をレビューするときに使うドキュメント •JDK Bug Systemで管理されている CSRドキュメント

    26 限りある工数のなかですべてを読むことはできない 自分たちのアプリに影響がありそうなものを優先して確認したい ベンダーの主観なく網羅的に調査することができる 各バージョン間で100件以上と件数が多い 例:JDK17 → JDK21で634件