JDK7→JDK8にバージョンアップした時の作業まとめ

12/25 追記

JDK8でmaven releaseプラグイン経由でJARを生成するときにjavadocを作成しててエラーになった。

maven-javadoc-pluginのconfiguration <additionalparam>-Xdoclint:none</additionalparam> 

を追加した

サーバ構成

インフラの構成ファイルはchefで管理

当初の予定

以前、他メンバーがJDK8にアップデートできるか検証してくれていて、NewRelicが対応していなかったため断念したという経緯があったので、そんなに変更が無いだろうと判断。

  1. 開発環境で軽く検証
    1. JDK7でコンパイルしたwarをJDK8上で動くか
    2. 今のアプリをJDK8でコンパイルできるか
  2. サーバ1台にJDK7でコンパイルしたwarをJDK8上で動くか検証する。問題があれば即座にロードバランサーから切り離す。
    1. NewRelicやMunin,Zabbixの確認
  3. 問題なければ全サーバへJDK8をアップデート(アプリはJDK7でコンパイル)
  4. JDK8でコンパイルしたアプリをデプロイする (←ここはまだ)

もちろんすべての動きを開発環境で確認できるのがベストだが無理かつ、他システムと連携している部分は最終的には本番環境でしか確認できない。
よって、実際に稼働しているサーバに入れて、ログを監視して問題があれば、ロードバランサーからサーバを切り離してユーザがアクセス出来ないようにする方針を取った。

開発環境上でハマったところ

  1. コンパイルが通らない
    • lombokのバージョンが古かったので最新にバージョンアップ
  2. テストがコケる
  3. Jenkins(Version 1.555)がJDK8で起動しない
    • Jenkinsを最新に変更した

Springのバージョンアップが入った時点で予定変更

  1. 開発環境上で検証
  2. Springのバージョンを上げた状態のアプリがJDK7上で動くか確認
  3. 上記のアプリがJDK8上で動くか確認
  4. 問題なければ全サーバへJDK8をアップデート(アプリはJDK7でコンパイル)
  5. JDK8でコンパイルしたアプリをデプロイする

本番環境へ入れてみてハマったところ

  1. 特定の外部システムとHTTPS通信している箇所でSSLHandshakeExceptionが発生した
    • HTTPSでなくても問題ないとのことだったので、HTTPへ変更
  2. JVMメモリ上にキャッシュさせているimmutableなマスタデータを各リクエスト時に再度ソート、フィルタしてた。JDK8でListやCollectionsの実装などが変わってたので見つかった
    • プログラム直す

性能/JVMパラメータ

JDK7でコンパイルしたアプリをJDK8上で動かしても特に性能落ちていない。
JVMパラメータなどはPermSize→MetaspaceSizeに変更して、MaxDirectMemorySizeを追加したぐらいで、G1GCは入れてない。
問題が起きた時に何が原因かわからなくなるので、変更は最小限にしたかった。
G1GC導入は他の優秀なエンジニアがやってくれるはず|д゚)チラッ

感想

  • 当初、他作業と平行してやろうと思ってたが、やっぱり無理だったので、この作業だけに専念できたのは大きかった
  • 社内のプライベートクラウドが便利だった。一人あたり5CPU分つかえたので、JDK7とJDK8を入れたサーバを用意して、それぞれで問題ないか検証してた。
  • SpringのバージョンアップCVE-2014-3578 Directory Traversal in Spring Frameworkの問題が見つかったので、Springのバージョンを3.2.12にあげて正解だった。

参考にしたもの

WEB+DB PRESS Vol.82

WEB+DB PRESS Vol.82

  • 作者: 山口徹,Jxck,佐々木大輔,横路隆,加来純一,山本伶,大平武志,米川健一,坂本登史文,若原祥正,和久田龍,平栗遵宜,伊藤直也,佐藤太一,高橋俊幸,海野弘成,五嶋壮晃,佐藤歩,吉村総一郎,橋本翔,舘野祐一,中島聡,渡邊恵太,はまちや2,竹原,河合宜文,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/08/23
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る