Javaアプリのライブラリバージョンアップ/依存関係解決

はじめに

今年振り返ると、だいたいJavaのWebアプリのライブラリ/フレームワークを整理/バージョンアップの対応をしていました
バージョン変えるのに何調べたかとか、どんなバグが発生したかとか話します

バージョンアップの理由

  • クラウド移行にあわせて以下のような変更
    • Java 6 → 8
    • 実行環境 Weblogic → Tomcat
    • Redisサーバの追加(セッション維持のため)
    • Oracle DB 11g → 12c R2
  • → 最新バージョンのほうがバグがなくなってたり、より便利になっていたりするのでバージョンアップする

バージョン選定の流れ

  1. springの各バージョンの変更点を確認
  2. 現在使用しているライブラリを一覧化
  3. 各ライブラリの最新バージョンの確認
  4. ライブラリにセキュリティ面で問題はないかの確認

springの各バージョンの変更点を確認

  • フレームワークはアプリに大きく影響するので優先して確認
  • バージョンごとの変更点はgithubのwiki/Release-Notes
    • spring boot使うか検討していたのでそちらも確認
  • 5.x系にバージョンアップしたくても他ライブラリ等に影響があるので注意
    • velocity template使っているのに連携クラスがなくなるとか・・
      • velocity使えなくなると改修範囲が大きすぎるので今回は5.xには変えない・・
  • マイグレーションガイド
  • spring session
    • redis使うので対応するバージョン等を確認

現在使用しているライブラリを一覧化

  • 各ライブラリがどのような機能で使っているのか確認
  • プロジェクトレポートプラグイン
    • Maven/Gradleで使える
    • プロジェクトの依存関係をレポート出力
    • 出力結果
  • そもそも使っていないのがある?
    • 不要なのは削除
    • ソースコード上は使っていないがライブラリで必要な可能性もある

各ライブラリの最新バージョンの確認

  • リポジトリの取得元がmaven repositoryであればライブラリのHPリンク記載あり
    • 情報がなければgithubかググって探す・・(だいたいgithubにあった)
  • 対応するJavaバージョン確認
  • Release Noteから変更点を確認
    • アプリへどのような影響があるか
  • jdbcドライバのバージョン確認
    • 影響するのはJavaとDBのバージョン

ライブラリの脆弱性確認

  • OWASP dependency check
    • OWASP(Open Web Application Security Project)
      • Webアプリケーションセキュリティのコミュニティ
    • 脆弱性の診断をしてくれるプラグイン
      • NVD(National Vulnerability Database)などに報告があるかチェック
        • 脆弱性情報データベース
    • 出力結果
      • 解決済みのも出力される
  • 明らかな脆弱性があるライブラリは使いたくない

バージョン変更後

  • テストコード実行

  • ビルド・デプロイ → ログインして動かす

いろんなエラーが起きた✌️😇

バージョンアップによって生まれたバグ

  • 別モジュールの画面へ遷移できない
  • ログインできない
  • oauth2を使った機能が動かない
  • 画面が文字化けする
  • テストコードコンパイルエラー
  • など・・

主な原因

  • springの各バージョンアップによりデフォルトの挙動が変わった
  • セッション維持の方法を変えたため
  • テストコードの書き方が変わったため(Mockitoとか)

まとめ

  • ライブラリ/フレームワークのバージョンを全て変えるのは辛い
    • 変えなくても問題ないのであればそれでも良い
  • フレームワークのバージョンを変えるのが一番影響が大きい
  • 依存関係を全て確認したい場合はプロジェクトレポートを使うと良い
  • 現在使っているライブラリに脆弱性があるかどうかはOWASPのプラグインを使うと良い

参考にしたもの

参考にしたもの