Java : OpenJDK と OracleJDK の違い
本記事では、Java の開発キットである OpenJDK と OracleJDK の違いについて解説します。
はじめに
この記事は、OpenJDK バージョン 21 を対象として解説しています。
また、この記事の内容が古くなっている、もしくは間違っている可能性もあります。
よって、特に ライセンス については 必ずご自身でもよく確認してから JDK をご利用ください。
OpenJDK と OracleJDK の違い
簡単に違いをまとめると…
という感じです。
長期サポート(LTS) とは
LTS とは長期サポートのことです。
Long-Term Support の頭文字ですね。
OracleJDK は LTS に対応しています。
ただし、すべての JDK バージョンで対応しているわけではありません。
【JDK バージョンと LTS 対応表】
バージョン | リリース日 | OpenJDK | OracleJDK |
---|---|---|---|
JDK 17 | 2021年9月 | - | LTS |
JDK 18 | 2022年3月 | - | - |
JDK 19 | 2022年9月 | - | - |
JDK 20 | 2023年3月 | - | - |
JDK 21 | 2023年9月 | - | LTS |
JDK 22 | 2024年3月 | - | - |
(2024/9/2 現在、最新の LTS 対応のバージョンは JDK 21 です)
例えば、JDK 21 で開発しているとしましょう。
JDK に不具合(A) が発生したら、通常、パッチがリリースされます。
- JDK 21.0.1 (パッチ)
さらに不具合(B) が発生したら、またパッチがリリースされます。
- JDK 21.0.2 (パッチ)
さて、しばらくして JDK 22 がリリースされました。
そして、またまた不具合(C) が発生しました。この不具合は JDK 21 でも JDK 22 でも発生します。
ここで LTS かどうかの違いがあります。
【 OracleJDK (LTSあり) 】
JDK 21 と JDK 22 にパッチがあたります。
(JDK 21 は LTS 対応バージョンなので、長期間パッチが提供されます)
【 OpenJDK (LTSなし) 】
JDK 22 にだけパッチがあたります。
不具合(C) の修正された JDK を使いたいときは、メジャーバージョン (JDK 21 → JDK 22) を更新するしかありません。
もし運用中のシステムに対して、JDK のメジャーバージョンを上げるとなると、それなりに大がかかりなテストが必要となるでしょう。
OpenJDK とビルドの関係
OpenJDK を説明するにあたり、わかりやすさのため用語を3つ定義します。
- OpenJDK (ソースコード)
- 公式HP : https://openjdk.org/
- すべての JDK のベースとなるものです。オープンソース として公開されています。
このソースコードをもとに、いろいろなバージョンの JDK (バイナリ) がビルドされています。
- OpenJDK (バイナリ)
- 公式HP : https://jdk.java.net/
- Oracle によってビルドされた フリー な JDK です。
- OracleJDK (バイナリ)
- 公式HP : https://www.oracle.com/java/technologies/downloads/
- Oracle によってビルドされた JDK です。長期サポート(LTS) に対応しています。
ただし、ライセンスが少し特殊で、場合によっては フリー ではなくなります。
OpenJDK と OracleJDK どちらも、Oracle がビルドしているのがややこしいですよね …
ちなみに、Oracle 以外にも、例えば Microsoft や Amazon などがビルドしている JDK もあります。
ビルドされた各JDK (バイナリ) は、それぞれ違う ライセンス でリリースされています。
使うときにはよくご自身で各ライセンスをご確認ください。
OpenJDK (ソースコード)
OpenJDK (ソースコード) は Java SE の オープンソース としての実装です。
Java SE とは、
- Java 言語仕様
- 標準 API 仕様
- 仮想マシンの仕様
などの仕様の集まりのことです。
これらの仕様を OpenJDK は実際にソースコードで実装しているわけですね。
ライセンスは、
です。
GPL にクラスパス例外がついているのが特徴です。
OpenJDK (バイナリ)
OpenJDK (バイナリ) は、Oracle によってビルドされた JDK です。
OpenJDK (ソースコード) を、特に改変はせずにそのままビルドしている … はず。
もっとも標準的な JDK のビルドといえるでしょう。
個人でちょっと使うくらいであれば、この OpenJDK (バイナリ) をおすすめします。
ただし、長期サポート(LTS) には対応していません。
ライセンスは OpenJDK と同じですね。
OracleJDK (バイナリ)
OracleJDK (バイナリ) は、Oracle によってビルドされた JDK です。
OpenJDK (バイナリ) と違い、長期サポート(LTS) に対応しています。
ただし、ライセンスは OpenJDK (バイナリ) と異なるのでご注意ください。
翻訳すると …
- JDK 21は、次のLTSリリースの1年後である2026年9月まで、NFTCの下でアップデートを受けることができます。それ以降のJDK 21のアップデートは、Java SE OTNライセンス(OTN)の下でライセンスされ、OTNライセンスの限定的な無償供与を超える実稼働での使用には料金が必要となります。
という感じですね。
ライセンスについて補足
OracleJDK (バイナリ) は、JDK 11 以降 フリー でリリースするのを中止しました。
しかし、JDK 17 以降では、期限付きで フリー でリリースするように変更となりました。
… という感じで、少し迷走しています。
JDK のラインセスは、
- ビルドの違い
- バージョンの違い
で異なることがあります。
実は違うバージョンのライセンスを確認していた … なんてことがないように注意しましょう。
まとめ
OpenJDK (バイナリ) は最も基本的な JDK で フリー で使えます。
個人で開発する場合や、小規模な開発などでは、おすすめの JDK です。
もし長期サポート(LTS) が必要であれば OracleJDK (バイナリ) を検討してみましょう。