さて、以前から有償サポートのみとなったことが話題になっている、Oracle JDK ですが、初のLTS(長期間サポート)となる、JDK 11 がリリースされました。
JDK 11 Release Notes, Important Changes, and Information
有償サポートになったからといって、お金を払わないと入手できなくなったわけではなくて、セキュリティパッチなどの公式アップデートが入手できなくなったということみたいです。
下記ダウンロードページに行けば、普通にダウンロードできます。
Java SE Development Kit 11- - Downloads
ライセンス上も、今までと同様に開発に使用することができるようです。ライセンスページが英語なため翻訳して読んだので、正確なところが理解できているか不安ですが、概略としては「アプリケーションの開発、テスト、プロトタイプ作成およびデモンストレーション」ができるとあります。
今までのOracle JDKだと、リリース後数回の公式アップデートが提供されてきました。例えば、JDK 8 だと、JDK8u181 のように、バージョン末尾に「u181」のような数字が付いた形で配布されます(181回リリースされたわけではないです。番号は飛び飛びです)。
JDK 11以降、無償のアップデート提供は完全に停止し、JDK8のようなアップデートの提供を受けるためには、 「Java SE Subscription」という月額利用料を支払うサポートサービスに加入する必要があるようです。費用は、「1ユーザー300円以下」とあります。買いたい人は、営業担当に連絡するという、古式ゆかしい、完全にエンタープライズな販売チャネルしか持っていないようで、AWSやGoogle AppsやOffice365のような、個人&SOHOを含めた一派ユーザー向けのサービスではないようです。
この「Java SE Subscription」に加入していない場合、アップデートを受けられないので詰んだという声が、主に企業(や官公庁)の調達部門方面から聞こえてきそうですが、実際には、これがそれほど重要なわけではありません。
以前にブログでも解説しましたが、OpenJDKという、中身が同じ(JDK11からまったく同じになったらしい)双子の兄弟がいまして、そちらは無償で利用できます。
アップデートの提供は、半年間*1だけですが、JDKのアップデートに追従すれば、最新のセキュリティとコンパイラ機能が提供されるので、そちらを利用すれば実質的には困らないと思います。
「そんなこと言ったって、セキュリティがー」という心配をされるかたもいるかとは思いますが、JDKとJREのアップデートは別物だということを考慮する必要があります。
今回サポートが有償化になったのは、基本的にはJDKという開発者が使う、コンパイラや解析ツール類を指していますが、完成したアプリケーションを実際に利用者が使用するのは、JRE(Java Runtime Edition)という実行環境だけがあればよいのです。
JREは、「同じバージョンか、古いバージョンのコンパイラでコンパイルされたバイナリ(classファイル)なら動く」という互換性がありますので、JDKのバージョンを上げることができなくても、JREのバージョンさえ上げておけば、実行時のセキュリティは担保されるということになります。
つまり、乱暴な言い方ですが、「開発環境は古いままで実行環境だけ最新版を入れろ」ということです。特にユーザー部門や官公庁なんて、自分たちで開発するわけじゃないから、JDKのサポートなんて気にしても仕方ないのではないかと思います。
ちなみに、ソースコードとJDKとJREのバージョン間の互換性ですが、概ね下図のようになっています。
青い線は問題なく実行できるラインで、同一バージョン間の運用(ソース→コンパイラ→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