JDKとかJava SEとかようわからん
2017/9にOracleのJavaサポート体制やリリースサイクルの変更がアナウンスされて、いろいろOpenJDKがどうだとかOracle JDKがどうだとかいう話が流れるようになりましたが、いまいち整理されてません。
ここでは、Javaの中心的な実装をあらわすっぽい用語について、整理しておこうと思います。
長文めんどい人は まとめだけ見るといいと思います。
そもそもJavaとは
Javaという用語に関しての明確な定義は難しいですが、ひとつだけ確実なのは、オラクルの商標であるということです。
会話として使われる「Java」は、Java SE仕様を中心としたソフトウェア実装や開発環境、ライブラリ、それらの開発者・団体、コミュニティ、利用プロダクトの傾向といった、「Java」という言葉のもとで語られる技術的なさまざまが含まれたものだと思います。
これはRubyやScalaなど、プログラミング言語に一般にあてはまると思います。
Java SEとは
Java SEは仕様の集まりです。
代表的なものとしては、Java言語仕様、Java仮想マシン仕様、Java API仕様があります。APIは特性として仕様と実装の分離は難しく、仕様書という形には なっていませんが、JavaDocになるべく詳細に動きが説明されています。
Java SEのそれぞれの仕様は、JCPというプロセスで決められます。JCPにはオラクル以外の企業や団体、個人も参加しています。
そして、Java SEの実装がそれらの仕様に従っているかをチェックするTCK(Technology Compatibility Kit)をオラクルが提供していて、そのTCKを通ることにより実装がJava SE準拠であると認められるということになっています。
正確には、Java 8とかJava 10というものは存在せず、Java SE 8だったりJava SE 10だったりの略称なのですが、実用的によく使われています。とくに、Java EEがJakarta EEに移行し、Java MEも表にほとんど出てこなくなった現状では、わざわざJava SE 11のように記述する必要性も減って、Java 11のように記述することのほうが増えているように思います。
OpenJDKとは
Java SEに基づいたソフトウェアや関連製品を開発するオープンソースプロジェクトと、そのプロダクトのソースコード置き場です。
OpenJDKのプロダクトには、Java仮想マシン仕様のとおりに動くJava VMや、Java言語仕様に基づいた文法で書かれたプログラムコードをJava仮想マシンで動くバイトコードに変換するJavaコンパイラ、Java VMの上で動いてJava API仕様にもとづたAPI実装、そしてプロファイラやデバッガなどの、実行環境や開発環境が含まれます。
OpenJDKのJava VMはHotSpot VMと呼ばれます。
実はバイナリは提供していません。jdk.java.netでバイナリがダウンロードできますが、java.netはオラクルのサイトで、ここでダウンロードできるのはオラクルがビルド・テストしたOpenJDKバイナリです。
他にも、AdoptOpenJDKやAzul System、Red Hatなどが独自のビルドバイナリを提供しています。Googleは自身のクラウドサービス用のOpenJDKバイナリを用意していますね。
JDKとは
JDKもオラクルの商標で、オラクルが提供するJava SE開発ツールキットの製品名です。
基本的にはOpenJDKとして開発されます。
Oracle JDKとは
単にJDKと言ったときに、OpenJDKかオラクルのJDKなのかがわかりにくいので、区別のためにOracle JDKと言われるようになりました。
OpenJDKの実装に、Flight RecorderやMission Controlのような商用機能、JavaFXやJava Web Startのようなデスクトップ機能を追加したものがOracle JDKでした。
ただ、Flight RecorderやMission Controlのような商用機能はOpenJDKに寄贈され、JavaFXやJava Web StartはOracle JDKにもバンドルされなくなるので、Java 11からはOpenJDKもOracle JDKも機能的には同一のものになっていきます。
ではバイナリに全く違いがないかというとそうでもなくて、Oracle JDKにはインストーラーがついています。
OpenJDKに更新リリースが出なくなったあとは、独自にパッチがあてられて更新リリースが出ることになります。また、もちろんライセンスも違います。
まとめ
Java = エコシステム
Java SE = 仕様
OpenJDK = Java SEの実装
Oracle JDK = オラクルがビルドしたOpenJDK + インストーラ
jdk.java.netのOpenJDK = オラクルがビルドしたOpenJDK
AdoptOpenJDKのOpenJDK = AdoptOpenJDKコミュニティがビルドしたOpenJDK
Zulu = AzulがビルドしたOpenJDK + インストーラ
IBM Java SDK = IBMがビルドしたOpenJDK - HotSpot VM + OpenJ9 + インストーラ