日々常々

ふつうのプログラマがあたりまえにしたいこと。

Javaのバージョンの取り扱い(2023年6月)

ツイート したらそれなりに反応があったので、少し丁寧に書いておこうかなと。

水物な内容なので、自動でつく投稿日時以外にもタイトルに「2023年6月」を入れて強調しておきます。

しょーとあんさー

よくわかんないならJava17にしておきましょう。

前提

ツイート。だよねーって思ったので、下に書いてたを持ち上げておきます。

LTSとかいう言葉が出てきますが、現在のJavaはメジャーバージョンがLTSと非LTSがあります。 OracleJavaSE を前提にしています。他のサポートも似たり寄ったりな感じと思っているけれど、自分たちが使ってるとこのサポートを確認してくださいまし。

また、本稿は「Javaのバージョン?何それ?」とか「色々あるけど最新使ってたらいいんだよね?」とかそういう方向けで、プロダクトのJavaバージョンを選定する方々向けではありません。そういうのに必要な知識には全然足りません。

選択肢になり得るバージョン

以下のバージョンを識別できていれば十分です。

  • Java8
  • Java11
  • Java17
  • (Java20)
  • Java21

過去バージョンは目にする機会がなければ識別しなくていいです。

Java8

非常に古いバージョンではありますが、まだまだ多くのシステムで現役で使われています。Java8からJava11の間にはいくらかの技術的な壁があり、おいそれと上げられるものではありません。

現在Java8で動作しているシステムは長い間継続して価値を生み出し続けているものであり、おそらく安定性が求められます。もしくは無い袖は振れないとか。仕方ない。

新規としては採用してはいけないバージョンです。現代のフレームワークやライブラリは使用できませんし、Java8で作ってしまうと以降は手を出せなくなります。よほどのことがあっても採用を避けることを強くお勧めします。

Java11

5年前で少し半端に感じるバージョンですが、Javaのリリースモデルが変わったJava9後の最初のLTSであり、注目が集まった時期でもあります。それまでメジャーバージョンについて行っていた組織が「最新についていこうとしたけど厳しい」と息切れをしたあたりの休息ポイントでもあります。

そんな背景のせいか、Java8ほどでないにせよ結構よく見るバージョンです。「サポートバージョンは11以降」となっているライブラリもそれなりに多いとかなんとか。

新規としては採用してはいけないバージョンです。何気にJava8よりもExtendedSupportが短いという理由で選んではいけないバージョンだったりします。Java17が出てもう2年になりますし、わざわざJava11を選ぶ動機が思いつかないです。

Java11はJava9などの技術的な壁を突破しているため、Java17へのバージョンアップは比較的容易です。比較的。実際のとこ問題がなかったとは言いませんが、解決が困難なものは踏んだ記憶はないです。もしJava11を使用していてアップデートをやったことがないのであれば、軽い気持ちで試してみましょう。うっかりできるかもです。

Java17

現在業務で採用するならこれになると思います。SpringBoot3.0はJava17以降しかサポートしていません。よくわかんないならJava17にしておきましょう。言語機能もいい感じ。

irof.hateblo.jp

概ねこの通りですね。業務実装でもRecordやText Blockは役立つので是非。先日のJJUG CCC 2023 Springのライブコーディングでも使い倒しました。switch式はenum多用してたらーかな。instanceofはライブラリとか作るなら結構いいんだけど、Java11サポートしておこうと思うと使えなくて悲しみ……。え、Sealed Class?使ってないねぇ。

3ヶ月後にはJava21が出ますが、切り開くモチベーションや熱意が捻出できないなら、フレームワークやライブラリの対応、世間の実績を待つのが無難ではあります。 今年いっぱいはJava17でいいです。これは出た直後にJava21を採用するような方々に向けて書いてませんので。

あ、最後に乗っけてるスライドのように、最新版でのビルドは回しとくことをお勧めします。

Java20

現行最新メジャーバージョン……ではありますが、「最新のJavaを使っておけばいいよね」という気持ちで選んでしまうと要らぬ苦労をしてしまうバージョンです。いや使っててもそんな問題は出ないんですが、何かにハマっても情報が期待できません。情報がないわけではないので情報収集能力がそれなりにあれば大丈夫かもしれません。それなりに関心がなければ読まないであろう「私のブログのこの文章」に辿り着けているので、大丈夫な可能性はそれなりにありますが、貴方だけが情報収集できてもメンバー全員にこれを求めるのは酷でしょう。

もしJava20を採用していてJava17に下げられない事情があるなら、3ヶ月我慢してJava21に進みましょう。

Java20は前述のように「最新バージョンで動作するか」を確認するCI環境や、新しいバージョンを試してみたい熱量ある開発者のローカル環境で使われるバージョンかと思います。

……メジャーバージョンを期間固定でリリースする意義は理解できるのですが、LTS以外はメジャーバージョン扱いされていないのが実情だと思います。とか言うのはJDK開発されている方々に失礼なんだろうな、と思いつつ。。

ごめんて。

Java21

9月リリース予定のバージョンです。 今年の年末、遅くとも来年以降はJava17の新規採用はJava11と同じ理由で「選ぶ理由がない」となり、Java21が選ばれるようになるはずです。

ツイートで「大コケしなきゃ」としているのは、互換です。Javaの互換性を考えるとまず致命的なのはないでしょうけれど、何も問題ないってこともないでしょう。すんなりいけば新規採用はもちろん、現在17を採用しているところでも21にするところは多いと思われます。

ちなみに17と比較して是非21にしたい!って魅力は新しさやJava8よりサポート期間が長い(Java8が長すぎんだよ)ってことくらい。コーディング的にはあんまり嬉しいことはないです。ないこともないけど、どうかなぁ……くらい。

言語機能に大きな差がないので、Java17で開発してJava21でリリース前のテストとかいう青写真はそれなりに現実的だと思います。この辺りはタイミングものですね。

その他のバージョン

趣味でどうぞ。

20はまだ最新メジャーバージョンなので20のとこに書いた理由で使われるのは分からなくはないですが、9,10,12,13,14,15,16,18,19を積極的に選ぶ理由は思いつきません。もし使ってたらすぐに変えることをお勧めします。モブとかを眺めていると18が入ってるのに気づくこともありますが、そんな珍しいことではなかったりします。おそらく開発環境構築時に最新を選んだとかの理由だと思いますが……。

あ、7以前?応援してます。

💪(しばらくみたくない)

ってことで

これくらい抑えておけば十分だとおもいます。

変なこと書いてたらこっそり教えてください。

参考

JDKディストリビューションの話とかは本をどーぞ。状況は多少変わってるけど、どんな関係になってるのかとかはわかり良いと思います。

JDKのセットアップに関しては過去エントリ。

irof.hateblo.jp

バージョンアップの話は2015年に話したスライドを見てくださいまし。8年経ってますけど大きく外してはなさそうです。