先日、Oracle Javaの今後のサポートについて考察したのですが、1点漏れていた議論がありました。
Javaのランタイムエディション(JRE)のサポートについてです。
結論から言うと、JREは強い後方互換を保ってアップデートされるため、「常に最新版を使い続けろ」です。最新版を使っていればパッチが提供され続けます。
この点について、ちょっと複雑で誤解している人もいるかもしれないので、簡単に説明します。
- 過去のJavaソースコード → 最新のJDKではコンパイルできない(だいたい)
- 過去のJavaでコンパイルしたClassファイル → 最新のJREで実行可能
- 最新のJDKでコンパイルしたClassファイル → 過去のJREでは実行できない
- 過去の外部ライブラリでコンパイルしたClassファイル → 最新の外部ライブラリでは動かないかもしれない
よく、「Javaはバージョン間の互換性がない」という言葉を聞くことがありますが、実際には「1.」を指す場合が多いと思います。
確かに、Javaは、ソースコードレベルでは、新しい構文が追加され、過去の書き方が一部変更になったりするので、コンパイルが通らなくなります。しかし、それはコンパイラのバージョンによる非互換なため、ランタイムの非互換とは別の話になります。過去にコンパイルしたClassファイルを使うのであれば、最新JREで問題なく*1動くはずです。
逆に、最新のJDKでコンパイルしたClassファイルを過去のJREで動かそうとするとバージョンチェックに引っかかり動きません。最新のClassファイルには、最新のJREの機能が必要かもしれないからです。これは、素直に実行環境のJREを最新版にしましょう。それで問題ないはずです。
蛇足ですが、apache Commonsなどの外部ライブラリを利用している場合、こちらのバージョンが変更するとエラーになる可能性がありますが、これはJRE/JDKとは別の話になります。mavenなどを利用して、jarのバージョンを統一すれば回避できます。
今回のOracle JDK有償化との関係は?
ということで、「Oracle JDKが有償化した場合にJREはどうなるのか?」ですが、オラクル社はあまり気にせずに最新版のJREを提供し続けるのだと思います。
こちらは半年サイクルとは別に、セキュリティアップデートがあれば、必要なタイミングでアップデートされるでしょう。
そもそも、JDK側は開発者が開発環境で使用するため、セキュリティアップデートについてもランタイム側ほど優先度が高くありません(低いってわけでもないけど、比較的ってことです)。
そのため、半年ごとのメジャーアップデート以外で、セキュリティパッチが出ることはあまり考えられないと思います。
「古いバージョンを使っていても、重大なセキュリティホールがあればアップデートされるんでしょ?」という意見は見当違いという事になります。
結論
古いJDKを使っていても、JREは最新版を使おう
もうそれでいいでしょ・・・*2。