JDK、Oracle JDK、OpenJDK、Java SEってなに？

# JDKとかJava SEとかようわからん

2017/9にOracleのJavaサポート体制やリリースサイクルの変更がアナウンスされて、いろいろOpenJDKがどうだとかOracle JDKがどうだとかいう話が流れるようになりましたが、いまいち整理されてません。
ここでは、Javaの中心的な実装をあらわすっぽい用語について、整理しておこうと思います。
長文めんどい人のためにまとめると、こうです。

Java = プログラミング言語と実行環境を中心とした開発エコシステム
Java SE = プログラミング言語と実行環境、標準ライブラリの仕様
OpenJDK = Java SEを実装するオープンソースプロジェクト
Oracle JDK = オラクルがビルドしたOpenJDK + インストーラ

# そもそもJavaとは
Javaという用語に関しての明確な定義は難しいですが、ひとつだけ確実なのは、オラクルの商標であるということです。
会話として使われる「Java」は、Java SE仕様を中心としたソフトウェア実装や開発環境、ライブラリ、それらの開発者・団体、コミュニティ、利用プロダクトの傾向といった、「Java」という言葉のもとで語られる技術的なさまざまが含まれたものだと思います。
これはRubyやScalaなど、プログラミング言語に一般にあてはまると思います。

# Java SEとは

Java SEは仕様の集まりです。
代表的なものとしては、Java言語仕様、Java仮想マシン仕様、Java API仕様があります。APIは特性として仕様と実装の分離は難しく、仕様書という形には なっていませんが、JavaDocになるべく詳細に動きが説明されています。
Java SEのそれぞれの仕様は、JCPというプロセスでJSRとして決められていましたが、現状ではJEPというプロポーザルで個別の機能がまとめられ、Java SEにどのJEPを含むかだけJSRにまとめられています。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のように記述することのほうが増えているように思います。

また、この意味で「なくなるJava SE無償版」や「有料化Java SE」という表現は あまり正しくないのですが、オラクル自体がJava SEという言葉をあいまいに使っているように思います。ただこれは、「オラクルのサイトでJava SEといえばJDKのことだ」と解釈できなくもないので、オラクル以外の人がオラクルのJava SEを指すときは「Oracle Java SE」のようにして「なくなるOracle Java SE 無償版」「有料化Oracle Java SE」のようにしたほうが正確だと思います。

# OpenJDKとは

Java SEに基づいたソフトウェアや関連製品を開発するオープンソースプロジェクトと、そのプロダクトのソースコード置き場です。
ソースコードは以前はMercurialを使って独自サイトで管理されていましたが、Gitを使ったGitHub管理に移行しています。
https://github.com/openjdk/jdk

OpenJDKのプロダクトには、Java仮想マシン仕様のとおりに動くJava VMや、Java言語仕様に基づいた文法で書かれたプログラムコードをJava仮想マシンで動くバイトコードに変換するJavaコンパイラ、Java VMの上で動いてJava API仕様にもとづいたAPI実装、そしてプロファイラやデバッガなどの、実行環境や開発環境が含まれます。
OpenJDKのJava VMはHotSpot VMと呼ばれます。

実はバイナリは提供していません。jdk.java.netでバイナリがダウンロードできますが、java.netはオラクルのサイトで、ここでダウンロードできるのはオラクルがビルド・テストしたOpenJDKバイナリです。単に「OpenJDKをダウンロードする」というと このバイナリのことを指すことが多いですが、ちゃんと表現するときはOracle OpenJDKといいます。
他にも、Adoptium TemurinやAzul System、Red Hat、Amazonなどが独自のビルドバイナリを提供しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228058/3f111a47-1574-10d4-f203-007cf6b70520.png)

# JDKとは

JDKもオラクルの商標でJava Development Kitの略です。オラクルが提供するJava SE開発ツールキットの製品名です。
基本的にはOpenJDKとして開発されています。

Development Kitなのでコンパイラなど開発に必要なツールを含みます。実行時にだけ必要なものはJRE(Java Runtime Environment)として配布されていましたが、Java 9以降は廃止されています。その代わり、ソフトウェアの実行に必要なモジュールだけを含んだカスタムJREを作る仕組みが使われるようになっています。

# 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にはインストーラーがついています。
Oracle OpenJDKに更新リリースが出なくなったあとは、独自にパッチがあてられて更新リリースが出ることになります。また、もちろんライセンスも違います。

# まとめ
Java = エコシステム
Java SE = 仕様
OpenJDK = Java SEを実装するオープンソースプロジェクト
Oracle JDK = オラクルがビルドしたOpenJDK + インストーラ

jdk.java.netのOpenJDK = Oracle OpenJDK = オラクルがビルドしたOpenJDK
AdoptiumのOpenJDK = Temurin = AdoptiumコミュニティがビルドしたOpenJDK
Adoptium = AdoptOpenJDKが商標問題を回避するためにつけた新しい名前
Zulu = AzulがビルドしたOpenJDK + インストーラ
IBM Java SDK = IBMがビルドしたOpenJDK - HotSpot VM + OpenJ9 + インストーラ