セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

Javaランタイム(JRE)のサポートと互換性について

qtamaki.hatenablog.com

先日、Oracle Javaの今後のサポートについて考察したのですが、1点漏れていた議論がありました。

Javaのランタイムエディション(JRE)のサポートについてです。

結論から言うと、JREは強い後方互換を保ってアップデートされるため、「常に最新版を使い続けろ」です。最新版を使っていればパッチが提供され続けます。

この点について、ちょっと複雑で誤解している人もいるかもしれないので、簡単に説明します。

  1. 過去のJavaソースコード → 最新のJDKではコンパイルできない(だいたい)
  2. 過去のJavaでコンパイルしたClassファイル → 最新のJREで実行可能
  3. 最新のJDKでコンパイルしたClassファイル → 過去のJREでは実行できない
  4. 過去の外部ライブラリでコンパイルした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

*1:厳密には挙動が変わるかもしれませんが

*2:ランタイム時にjavacを呼び出すPlayframeworkとかいうフレームワークのことは考えないものとする