セカイノカタチ

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

Oracle JDK 11のリリースと有償化について

さて、以前から有償サポートのみとなったことが話題になっている、Oracle JDK ですが、初のLTS(長期間サポート)となる、JDK 11 がリリースされました。

JDK 11 Release Notes, Important Changes, and Information

有償サポートになったからといって、お金を払わないと入手できなくなったわけではなくて、セキュリティパッチなどの公式アップデートが入手できなくなったということみたいです。

下記ダウンロードページに行けば、普通にダウンロードできます。

Java SE Development Kit 11- - Downloads

ライセンス上も、今までと同様に開発に使用することができるようです。ライセンスページが英語なため翻訳して読んだので、正確なところが理解できているか不安ですが、概略としては「アプリケーションの開発、テスト、プロトタイプ作成およびデモンストレーション」ができるとあります。

Oracle Java SE License

今までのOracle JDKだと、リリース後数回の公式アップデートが提供されてきました。例えば、JDK 8 だと、JDK8u181 のように、バージョン末尾に「u181」のような数字が付いた形で配布されます(181回リリースされたわけではないです。番号は飛び飛びです)。

JDK 11以降、無償のアップデート提供は完全に停止し、JDK8のようなアップデートの提供を受けるためには、 「Java SE Subscription」という月額利用料を支払うサポートサービスに加入する必要があるようです。費用は、「1ユーザー300円以下」とあります。買いたい人は、営業担当に連絡するという、古式ゆかしい、完全にエンタープライズな販売チャネルしか持っていないようで、AWSやGoogle AppsやOffice365のような、個人&SOHOを含めた一派ユーザー向けのサービスではないようです。

オラクル Java SE Subscription FAQ

この「Java SE Subscription」に加入していない場合、アップデートを受けられないので詰んだという声が、主に企業(や官公庁)の調達部門方面から聞こえてきそうですが、実際には、これがそれほど重要なわけではありません。

以前にブログでも解説しましたが、OpenJDKという、中身が同じ(JDK11からまったく同じになったらしい)双子の兄弟がいまして、そちらは無償で利用できます。

アップデートの提供は、半年間*1だけですが、JDKのアップデートに追従すれば、最新のセキュリティとコンパイラ機能が提供されるので、そちらを利用すれば実質的には困らないと思います。

「そんなこと言ったって、セキュリティがー」という心配をされるかたもいるかとは思いますが、JDKとJREのアップデートは別物だということを考慮する必要があります。

今回サポートが有償化になったのは、基本的にはJDKという開発者が使う、コンパイラや解析ツール類を指していますが、完成したアプリケーションを実際に利用者が使用するのは、JRE(Java Runtime Edition)という実行環境だけがあればよいのです。

JREは、「同じバージョンか、古いバージョンのコンパイラでコンパイルされたバイナリ(classファイル)なら動く」という互換性がありますので、JDKのバージョンを上げることができなくても、JREのバージョンさえ上げておけば、実行時のセキュリティは担保されるということになります。

つまり、乱暴な言い方ですが、「開発環境は古いままで実行環境だけ最新版を入れろ」ということです。特にユーザー部門や官公庁なんて、自分たちで開発するわけじゃないから、JDKのサポートなんて気にしても仕方ないのではないかと思います。

ちなみに、ソースコードとJDKとJREのバージョン間の互換性ですが、概ね下図のようになっています。

f:id:qtamaki:20180926182107p:plain

青い線は問題なく実行できるラインで、同一バージョン間の運用(ソース→コンパイラ→JREが同じバージョン)が問題ないのは当然として、ランタイム時には、古いバージョンのJDKでコンパイルされたバイナリの実行がサポートされます。

一番右下のJRE11の部分に「?」マークがついていますが、これは、現時点でJRE11がリリースされていないので、よくわかってません。^^;

まさか、JREをリリースしないなんてことはないと思いますが、軽くググった感じでは情報が無かったので、現状では何とも言えません。

Java9から入ったプロジェクトジグソーにより、必要最低限な実行環境をパッケージに含めることができるようになったため、「ランタイムを別途配布するのではなくパッケージに含めろ」というのがJava開発サイドからのメッセージらしいですが、JREを配布しないというのは流石に・・・まさか・・・ね?

まあ、最悪の場合、最新のJDKにオプション(-source, -target)をつけることで古いバージョンを模倣することができますので、そちらを利用すれば古いソースコードでもコンパイルできるし実行できるので、何とかなるんじゃないかと思います(急にトーンが下がる)。

まとめると

  • Oracle JDK11がリリースされた
  • 無償のアップデートは提供されない
  • Open JDKを使うか、ランタイムだけ最新版を入れるという回避策がある
  • 最悪コンパイラのオプションで古いバージョンをエミュレートすれば・・・

ということで、ビバ!ジャヴァ!

*1:オラクルの人は「少なくとも」半年間という表現をしているようです: http://mail.openjdk.java.net/pipermail/jdk-dev/2018-August/001824.html