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

No More NoSuchMethodError

No More NoSuchMethodError

Avatar for TATSUNO Yasuhiro

TATSUNO Yasuhiro

October 14, 2026

More Decks by TATSUNO Yasuhiro

Other Decks in Programming

Transcript

  1. 😭 本番障害 塩 漬 No More NoSuchMethodError け Server-Side Kotlin

    Meetup vol.20, 2026-10-14, TATSUNO Yasuhiro, @exoego
  2. 各事案の要因は⾊々あろうが JVM でも ライブラリの脆弱性が攻撃に使われてきた 2015 Commons Collections 2015 Spring EL

    2016 Struts 1 2017 Struts 2 2017〜 Jackson 2017〜 Fastjson 2019 Ktor 2020 Ktor 2021 Log4j2 2022 Spring Kotlin の話題 これで最後です
  3. M h c u S o N r o r

    r E d o h t e 😇 これってさぁ! 静かに壊れる… ってコト!? NoClassDe fFoundErro r s e c c A l ega r o r sEr
  4. ①弊社コード利⽤ ②google-cloud-firestore:3.47.0 の内部コード 利⽤ ③ opentelemetry-grpc-1.6:2.23.0-alpha ④SqlStatementSanitizer が 使えるバージョンに otel系ライブラリを更新した

    opentelemetry-jdbc:2.25.0-alpha の内部コード ⑥⾮互換:newClientInterceptor が 2.25.0 で削除 ⑤opentelemetry-grpc-1.6:2.25.0-alpha version.ref を⼀緒にしてたので つられて更新 ⑦NoSuchMethodError: 'ClientInterceptor GrpcTelemetry.newClientInterceptor()'
  5. Class ファイルのバイナリ⾮互換で起きる • google-cloud-firestore:3.47.0 は、古い依存バージョンのシグネチャで コンパイル済 • ⼀⽅、実⾏時のクラスパスには新しいバージョンがり、古いシグネ チャが消えてた(バイナリ⾮互換) •

    コンパイル時、ライブラリの class ファイルまでチェックされない でも実際どう⾔うこと? と思ったので図解を作ってみた https://www.exoego.net/jvm-visualized/
  6. 既存⼿法との⽐較 uika(本提案) やること 結合テスト ライブラリのバイトコードの変化 Spring や Ktor などを起動 と、⾃コード側で使ってるものを

    し、ライブラリひと通り 付き合わせ、破壊的変更を検出 ロードされる形でテスト E2E (End-to-End) テスト 個別のコンポーネントだけでな く、連携する複数コンポ(多く の場合 Web UI やモバイルアプ リ含む)を結合してテスト タイミング PR(プルリクエスト) PR PR〜定期実⾏ 処理時間 数⼗秒〜数分 数分〜数⼗分 数⼗分〜数時間 強み 速い リフレクションも含めて テスト追加不要 検出できる(テスト書け テストない部分もある程度検出可 ば) モックがちな外部連携を実際に テストできる(テスト書けば) 弱み リフレクションを使った呼出は 検出不能 環境構築の敷居 インフラ稼働コスト 個別PRマージ後にテストが動く ので気づくまでにかなり時間差 ツールが未成熟!! 呼出部分のテストを追加 し忘れると検出不能