code smith

開発で日々の生活をもっと楽しく

scalaをやる時にどのJDKを選べば良いのか問題について

f:id:gaku3601:20210102082613p:plain gakuです。
最近scalaを勉強しています。
scalaJVM上で動く言語で、動作させるのにJDKをインストールする必要があります。
で、そのJDKですが、ありとあらゆるJDKが存在し、かつバージョンもいろいろあり、導入時点でものすごく悩みます。
javaを長年触っている方であれば簡単な問題かもしれませんが、

scalaやる時に結局どのJDKでどのバージョンを利用すれば良いのよ?

と思ったので自分が忘れないためにもどのJDKを利用すれば良いか少しまとめたいと思います。

JDKのLTSという概念

JDKにはLTSという概念があります。
LTSとは「長期サポートを保証しますよ」というものらしく、JDK8とJDK11はLTSとして配布されていますが、最新のJDK15とかJDK14とかはLTSではないです。
JDKは8をインストールしましょう!」とか「JDKは11をインストールしましょう!」とかそういった記事が多いのは、このLTSという概念があるためです。
個人・企業とわず、長期サポートは欲しいため、この時点でJDKのバージョンは8 or 11に絞られます。
ちなみに、JDKの時期LTSは2021年の秋頃に配布予定のJDK17となるようです。それまでは8 or 11を利用すれば大丈夫だと思います。

scalaの推奨JDKバージョンについて

javaで実装する場合、最新の言語仕様を利用し開発したいと思うので、LTSを考慮するとJDK11をインストールしておけば間違いないですが、scalaの場合は一概にそうとは言えないようです。
scalaは利用するJDKバージョンによって利用可能なscalaバージョンが決まっています。
scala公式のドキュメントを参照すると、以下のようになっています。
f:id:gaku3601:20210102075322p:plain JDK Compatibility | Scala Documentation

JDK8だと「2.13.4, 2.12.12, 2.11.12, 2.10.7」のscalaバージョンが利用でき、JDK11だと「2.13.4, 2.12.12, 2.11.12」となっており、JDK8の方が利用可能なscalaのバージョンが多いです。 なので、scalaをやるならJDK8を利用した方が良いと思います。

どのJDKがいいの?

OracleJDKとかOpenJDKとかありとあらゆるJDKがありますが、JDKの選定は「好きなものを選べば良い」と思っています。
(正直JVM系言語初心者にはどのJDKが良いかは不明です。
個人的にbrewから簡単に導入可能でかつ、無料なadoptopenjdkを利用しています。

adoptopenjdk.net

HotSpot or OpenJ9

adoptopenjdkのダウンロード選択肢としてHotSpotかOpenJ9のどちらをインストールするか選ばないといけません。
HotSpot: OpenJDK コミュニティのJVMで現在最も利用されているJVM
OpenJ9: EclipseコミュニティーJVM で、低メモリ使用量と高速起動用に設計されている。
とのことなので、特にこだわりがなければHotSpotで問題ないかなと思います。

結論

scalaをやるなら

「adoptopenjdkのバージョン8でjvmはHotSpot!」

まとめ

正直、java業界はJDK界隈が乱立してて混沌としてる気がしてならない。 JVM系言語の参入障壁がこのJDKに起因している気がするので、なんとかして欲しいものだなと思います。
(ここが理解できていなくて、長年JVM系言語を触ってこなかったのはこの僕です。

とりあえず、現状の解を持てたので、この環境構成で楽しくscala開発をやっていきたいと思います!