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

1年を振り返ってという題目で社内LTで発表しました。その時の話になります。

(LTは題目に沿った内容でなくても良かったのですが)

資料はこちらです。

以下は詳細な内容となります。 

 

はじめに

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

 

バージョンアップの理由

オンプレからクラウドへの移行にあわせて以下の変更がありました。

  • Java 6 → 8
  • 実行環境 WeblogicTomcat
  • Redisサーバの追加(セッション維持のため)
  • Oracle DB 11g → 12c R2

上記の理由に当てはまらなくても、最新バージョンのほうがバグがなくなってたり、より便利になっていたりするのでバージョンアップすることにしました。

 

バージョン選定の流れ

以下の順で作業を進めました。

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

 

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

このWebアプリではSpring Framework, Spring Security, Spring Data JPAなど、Springのモジュールをいくつか使っています。

フレームワークのバージョン変更はWebアプリに大きく影響するので優先して確認することにしました。
バージョンごとの変更点は各モジュールのreferenceやgithubwiki, Release-Notes, マイグレーションガイドから確認しました。
Spring Bootを使うか検討していたのでそちらも確認しています。
Spring Frameworkのバージョンアップをするのに、他ライブラリ等に影響があるので注意しないといけません。というのも、今回、4.1→5.xに変えることを考えていたのですが、velocity template使っているのに連携クラスがなくなるため、全ての画面(html)を修正する必要がありました。全ての画面テンプレートを改修するとなると改修規模が大きすぎてスケジュール的に厳しいとのことで5.x系へのバージョンアップは断念することとなりました。
最後に、Session維持のためにSpring Session, Redisを使うので対応するバージョン等の確認をしました。 

 

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

Spring以外はWebアプリでどのようなライブラリを使用しているのか知らなかったので、プロジェクトレポートプラグインを使って一覧化しました。

http://gradle.monochromeroad.com/docs/userguide/project_reports_plugin.html

こちらはMaven/Gradleで使用可能なプラグインで、依存関係をレポート出力してくれます。

HTML出力結果は以下のようになります(今回対応したWebアプリの依存関係ではありません)

https://yito0000.github.io/java-webapp-dependencies-update-docs/dependencies/index.html

対応したWebアプリでは使用しているライブラリが何十とあり、知らないものもいくつもありました。このレポートの内容をExcelに貼り付け、対応前後のバージョン、使う理由等、まとめることにしました。

一通り確認したところ、そもそも使っていないものがあり、それらは依存関係から削除することにしました。

ソースコード上は使っていないがライブラリを使用するのに必要なものもあり注意が必要でした。

 

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

リポジトリの取得元がmaven repositoryであればライブラリのHPリンク記載があります。情報がなければgithubかググって探しました。(だいたいgithubにあった)

確認したのは以下についてです。

  • 対応するJavaバージョン
  • バージョンごとの変更点(Release Noteから)
  • バージョン変更によってWebアプリへどのような影響があるか

OracelのjdbcドライバのバージョンについてはOracleのドキュメントから確認しました。影響するのはJavaとDBのバージョンです。

 

ライブラリの脆弱性確認

明らかな脆弱性があるライブラリは使いたくないのでOWASP dependency checkを使って、バージョンアップ後のライブラリの脆弱性を確認しました。

https://plugins.gradle.org/plugin/org.owasp.dependencycheck

https://www.owasp.org/index.php/OWASP_Dependency_Check
OWASP(Open Web Application Security Project)というのはWebアプリケーションセキュリティのコミュニティのことです。
このプラグインはNVD(National Vulnerability Database)などに既知の脆弱性のがあるか確認をしてくれます。
出力結果は以下のようになります。(今回対応したWebアプリのチェック結果ではありません)

https://yito0000.github.io/java-webapp-dependencies-update-docs/dependency-check-report.html
解決済みの内容についても出力されるようでした。

バージョン変更後

バージョン変更し、以下を試しました。

  • テストコード実行
  • ビルド・デプロイ → ログインして動かす

すると、いろんなエラーが起きました✌️😇

 

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

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

上記以外にも様々なバグが発生しました。


主な原因

  • springの各バージョンアップによりデフォルトの挙動/処理が変わったため
  • セッション維持の方法を変えたため
    • Spring SessionのConfigureクラスを実装していたのですが、それだけでは足りていませんでした
  • テストコードの書き方が変わったため(Mockitoとか)

まとめ

  • ライブラリ/フレームワークのバージョンを全て変えるのは辛い
    • バージョン変更による影響範囲を把握するのが難しかったです
  • 変えなくても問題ないのであればそれでも良い
  • フレームワークのバージョンを変えるのが一番影響が大きい
    • 初めはJava6→8による影響を心配していたのですが、Javaのバージョン変更だけでは特に問題なくWebアプリは動きました
  • 依存関係を全て確認したい場合はプロジェクトレポートを使うと良い
  • 現在使っているライブラリに脆弱性があるかどうかはOWASPのプラグインを使うと良い

 

ライブラリの選定よりバージョン変更後のバグ対応が圧倒的に時間がかかりました。

現在は全てのバグを解消して、Webアプリは問題なく動いています。