こんにちは!ICPの主にバックエンドの面倒をみているまるやまです。
今秋いよいよ2年ぶりにJavaのLTS版であるJava17がリリースされます。ICPのバックエンドではJavaを実行環境として利用しているので、次期LTSのリリースに合わせて実行環境の最新化を検討し始めました。が、軽い気持ちで調べ始めたところ、APIサーバだけでも思いの外やるべきことが多くて泣けました。今回はその辺の話でもしようと思います。
まずは結論から
現在のICPで実装しているAPIサーバの主要な技術スタックは以下のような構成になっています。
- Play Framework 2.6
- ScalikeJDBC3.4.x
- Scala 2.12.10
- Java11 (旧AdoptOpenJDK)
上記を出発点として、今後APIサーバがJava17に対応した結果、以下のような構成にアップデートする必要がありそうです。
- Play Framework 2.9
- ScalikeJDBC3.4.x
- Scala 2.13.6
- Java17 (Adoptium)
また、最終的な構成に至るまでの工程は、おおよそ以下のようになるでしょう。
- Java17対応までの道
- まずはPlayのバージョンを2.8に上げる
- Scalaのバージョンを2.13.6に上げる
- Play2.9にバージョンを上げる(Playリリース後なる早)
- Java17にバージョンアップ ← 我々が本当にほしかったもの
以下では、上記のロードマップを引くに至るまでに得た情報を整理したいと思います。
各種ライブラリを取り巻く状況の整理
Java17に対応するにあたっての事前調査では、以下のような考えを持って調査を進めていきました。
- [前提] 万が一フレームワーク/ライブラリ起因の問題が発生したときに開発元のサポートを期待できる推奨環境は満たしておきたい
- 基本的には弊社内ですべての面倒を見る前提ですが、それでも解決できない問題が発生したときに開発元の助言が得られる可能性が高まるのでチョット安心
- [仮説] Java17へのバージョンアップはリリースされたらなるべく早く対応したい
- Java11のLTSについては、リリース当初のアナウンスではリリースから約2年(次期LTSのリリースとともに終了)と設定されている実装が多かったと記憶している
- そのため、Java17のリリースに伴い一時的に推奨環境を満たさない期間が発生しそうな見込み
- よって、サポートの前提条件を再び満たすためにJava17がリリースされたらなるべく早いうちにアップデートしておく必要があるのでは?
- [仮説/要望] Scala自体のバージョンアップは可能であれば後回しにしたい
- 影響範囲を極小化したいため、Java17対応とは別の時間軸で対応できるのがベター
Java
AdoptOpenJDK11のLTSが少なくとも2024年の10月までは提供されることが明記されていました。よって、Java17リリースからしばらくの間はJava11もLTSは継続されるため、リリースから約2年(次期LTSのリリースとともに終了)
という当初の仮説は杞憂であることがわかりました。ありがたやありがたや。
https://adoptium.net/support.html
Scala
Scala2.13.6、及び2.12.5がJava17との互換性を保証していることが明記されています。
https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html
パッチレベルでのバージョンアップはしておいた方がよいものの、2.12系で全く動かないわけではないということがわかりました。よって、2.12系のままJava17対応イケるかも、そう思っていた時期が私にもありました。
Play Framework
そもそもの話として、Play FrameworkがJava11を公式にサポートしているのはPlay2.8からであることを見落としていることが判明しました😇
https://www.playframework.com/documentation/2.8.x/Highlights28#Java-11-support
昨年APIサーバにおけるPlayのバージョンアップを行った際、当初は2.8までのアップデートを計画していた(?)ものの、2.6に上げた時点で力尽きてそのまま忘れていたようです。というわけで、何かあったときに開発元の助力を得られそうなPlay2.8へのアップデートは取り急ぎ対応する必要があります。死にたい
また、今後のリリースでいつからJava17を公式サポートするかは気になるところです。そこで、次期バージョンとなるPlay2.9のマイルストーンを確認する限りでは、Play2.9がJava17をサポートする最初のバージョンになりそう、ということがわかりました。ええやん〜。
https://github.com/playframework/playframework/pull/10819
一方で、Play2.9でScala2.12のサポートを打ち切りそうな動きが見えており、Play2.9に上げる際には、サポートが受けられる前提条件としてScalaのバージョンを2.13に上げる必要がありそうということが判明します。まじかー。
https://github.com/playframework/playframework/pull/10956
Scalikejdbc
Play Frameworkをサポートしており、且つバージョン2.6以上であればサポートすることは明言しているので、ひとまずは今後も安心して使えそうです。
http://scalikejdbc.org/documentation/playframework-support.html
まとめ
ICPのAPIサーバをJava17に対応させようとすると、思いの外やることがたくさんあることがわかってきました。
- ① まずはPlayのバージョンを2.8に上げる
- そもそもJava11を公式サポートするPlayのバージョンは2.8以上なので、ここを解消しにいくことが急務
- ② Play2.9の開発状況を見守る
- Play2.9がJava17をサポートする最初のバージョンになるかもしれない(未確定)
- Play2.9がScala2.12を打ち切るかもしれない(未確定)
- ③ (おそらく)Scalaのバージョンを2.13.xに上げる
- まだ未確定ながら、Play2.9でScala2.12のサポートが打ち切られる可能性は高め。よって開発元の方針に因ることなく、率先してScala自体のバージョンを2.13に上げた方が長い目で見たときに手間が少なそう
- 幸いJava11とScala2.13.xは互換性が担保されているので、Scala自体のバージョンを2.13に上げる上での障壁はなさそう
- ④ Play2.9がリリースされたらできるだけ早いうちにPlay2.9にバージョンを上げる
- ⑤ Java17にバージョンアップ
今回はあくまでもロードマップを提示することに話題を絞ったので内容としては少なめです。が、Java17対応に至るまでの各作業について言えば、地味ながらそれなりの規模があることは予見されます。大変めんどくさいですね。
とはいえ、AdoptOpenJDKのJava11のLTSは2024年8月までは最低限担保されているので、全ての工程を終えるまでに最大約3年の猶予があるのはせめてもの救いでしょう。もちろんそんなに時間をかけて対応するつもりはありませんが。
というわけで、今回調べたことが皆さまの一助になれば幸いです。