Javaバージョン履歴

本稿ではJavaプラットフォームの基準であるスタンダード版のメジャーバージョン履歴を説明する。その他にもエンタープライズ版、マイクロ版、カード版といった周辺エディションが存在し、それぞれが個別にメジャーバージョン改訂を行っているが、いずれもスタンダード版改訂を基準にしそれに後発する時系列でリリースされている。 Javaプラットフォームの初回バージョンは、ブランド名「Java」プロダクト名「Development Kit」からプロパー名「Java Development Kit」とネーミングされ通称は「JDK」とされた。当初のメジャーバージョン値は小数点第一位にされた。通称にバージョン値を付けたものがリリース名になった。まだ国際化対応はされず英語版のみだった。 ファイル入出力 ネットワーク接続（TCPソケットとUDPソケット） データコレクション（Array、Vector、List、Set、Map） 数学演算 アプレットとセキュリティ Abstract Window Toolkit（グラフィカルユーザーインターフェースサポート） 国際化対応さ リフレクション（クラスメタデータ操作API） Java Text（文章、暦、日付、数値などの国別書式） Input Method Framework（文章入力の国別書式） Java 2D（グラフィックサポート） 大幅な技術刷新によりブランド名が「Java 2」に改められた。統合仕様の確立でプロダクト名が「Platform」に改められた。エディションの分化で「Standard」が付加された。こうしてプロパー名「Java 2 Platform, Standard Edition」通称「J2SE」になった。ここからコードネームが付けられるようになった。翌年にエンタープライズ版「J2EE 1.2」とマイクロ版「J2ME 1.2」もリリースされた。 strictfpキーワード（言語仕様、浮動小数点計算） 仮想マシンに実行時コンパイラ（Just-In-Time Compiler） Javaプラグイン（WEBブラウザへのアプレット実行環境挿入） Swing（グラフィックユーザーインターフェース） Collection Framework（コレクションAPI） Security Framework（セキュリティAPI） Java Internet Description Language（IDLからJava CORBA用スタブ＆スケルトンを生成） Java Accessibility API（画面Reader、音声認識、点字端末などのユーザー補助機能） ここからメジャーバージョンのコードネームは鳥獣名、マイナーバージョンは昆虫名にするのが慣例になった。 仮想マシンにHotSpotエンジン（動的再コンパイル技術と世代別ガベージコレクション） Java Platform Debugger Architecture（デバッガ・アーキテクチャ） Java Name and Directory Interface（ネーミング＆ディレクトリサービスAPI） RMI over IIOP（RMIをIIOPプロトコル上でも使える仕様） Java Sound（サウンドAPI） このバージョンからJavaコミュニティプロセス（Java Community Process）による仕様策定が開始された。 assert キーワード（言語仕様、デバッグ用ディレクティブ、任意条件でプログラム中断） Java Web Start 正規表現用API ロギング用API New I/O（非遮断ストリーム入出力、バッファストリームAPI） Image I/O（JPEGとPNGを使えるAPI） Preferences（ツリー型のJava式セーブデータ収納庫API） Java API for XML Processing（XMLパーサ＆マニュピレータAPI、XSLTフォーマットAPI） Java Cryptography Extension（暗号化API） Java Secure Socket Extension（TLS / SSL用API） Java Authentication and Authorization Service（認証＆権限サービスAPI） メジャーバージョン値が整数部分に変更された。言語仕様に大幅な拡張が加えられた。メモリモデル改善でマルチスレッドも軽量化した。他エディションは「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「Java Card Platform」がエディション昇格し、バージョンは独自式のまま「Java Card 2.2」でリリースされた。 ジェネリクス（パラメトリック多相を付加したデータコンテナクラス→ List<T>） オートボクシング（ボックス化、プリミティブ値とラッパーインスタンスの自動変換） 列挙型（enumキーワードで定数クラスを定義） 可変長引数（引数欄の型名に3連ドットで配列渡しと解釈される→ void drawText(String... lines)） アノテーション（@キーワードでクラスメタデータに注釈タグと注釈コメントを埋め込むアドホック多相） 拡張for文（対象リストのイテレータ表現式になるfor文） 静的インポート文（クラス静的メンバのフルパスをimportで指定できる） Java Management Extensions（MBeanを用いた依存性の注入による実行プログラムの動的再構成の最適化） ブランド名が「Java 2」から「Java」に戻されてプロパー名「Java Platform, Standard Edition」となり、通称が「J2SE」から「Java SE」になった。バージョン値から小数点以下が外された。なおマイナーバージョン更新では再び小数点以下が付けられた。他エディションも「Java EE 5」「Java ME 5」になった。仮想マシンを含めた既存機能の改善と洗練に力が注がれた。 ジェネリクスの拡張。他言語のジェネリックプログラミングと同等に整備した。 Scripting for the Java Platform（スクリプト言語との連携サポート） Java Architecture for XML Binding（Java XMLアーキテクチャ） Java API for XML Web Services（WEB向けのXML） Java Compiler API（Javaコンパイラへのディレクティブに特化したAPI） Unicode正規化 API 差し込みアノテーション（インスタンス別、クラス派生別にアノテーションを埋め込めるアドホック多相） Swingの高速化、Windows用ルック＆フィールの追加、Windowsタスクトレイ表示 Update10で、Java Quick Starter（アプリ起動高速化）Java Kernel（Java環境インストール高速化）を搭載 サン社を買収したオラクル社による初のメジャーバージョンリリースである。 invoke_dynamic API（クラスインスタンスとメソッドシグネチャの組み換えによる動的ディスパッチ） New File I/O Library（新しいファイル入出力ライブラリ） Concurrency Library（並行処理API） 暗号化APIに楕円曲線暗号を導入 ネットワークAPIにStream Control TransmissionプロトコルとSockets Directプロトコルを導入 グラフィック関連の強化。Update2でJavaFXの導入 ここでコードネームが廃止された。長期サポート（LTS）リリース制度下の最終版である。 言語仕様にラムダ式の導入（引数 → 関数式） 言語仕様にメソッド参照の導入 関数型インターフェース（引数と返値をテンプレート化できるパラメトリック多相） Stream API（コレクションコンテナ各要素への連続的なラムダ式適用） JavaScriptのコードを埋め込めるNashorn Javaスクリプトエンジンの搭載（Project Nashorn） 型アノテーション（@interfaceで構造体化したアノテーションを定義、複数の注釈フィールドを持つ） 反復アノテーション（バックグラウンドタスクのクラスをアドホック多相で任意日時稼働にスケジュールする） Date and Time API（日付時刻） 静的結合 Java Native Interface ライブラリ ここからメジャーバージョンは一定の新機能蓄積を待たずに公開する毎年3月と9月の年2回定期リリース制に変更された。従来の長期サポート（LTS）が無くなり、原則的に半年間サポートになった。 従来のパッケージ（package）の上にモジュール（module）を追加（Project Jigsaw） 言語仕様の細かな拡張（Project Coin） 並行処理ライブラリの拡張 Compact Stringの追加 「JShell」の搭載。コンソール形式でJavaコードを入力し実行結果を確認できる 「The Java Linker」の搭載。ユーザー環境に最適なモジュールと仮想マシンモードを自動選択実行する 仮想マシンに前方コンパイル（Ahead-Of-Time Compilation）の導入 XML catalogs（永続的URLへのマッピング） HiDPI Graphicsの導入（画像拡大縮小の改善） G1（shorter-response-timeガーベジコレクタ） JSR 383にて仕様規定。ここから追加要素の大半は、標準機能相当のJSR（仕様要求）ではなく、拡張機能扱いのJEP（改善提案）になった。試作段階の機能がお試し用として追加されるようになった。 ローカル変数の型推論 ルート証明書 Unicode language-tag extensions（Unicode言語タグの操作） ガーベジコレクタ・インターフェース（各種ガーベジコレクタの共存連携操作） G1（shorter-response-timeガーベジコレクタ）用パラレル機能 ZGC（low-latencyガーベジコレクタ）第1回試作 JSR 384にて仕様規定。Java開発環境として「Oracle JDK」と「OpenJDK」の二つが提供されるようになり、前者の商用利用は有償長期サポート（LTS）契約を結んだ顧客のみになった。Java EEのアップグレードがエクリプス財団による「Jakarta EE」に移譲されたので、JDKにEnterprise版連携モジュールが含まれなくなった。CORBAモジュールも外された。Java FXも取り除かれた。このバージョンは長期サポート（LTS）対象にされているが、上述の通り有償LTSである。 Dynamic class-file constants（拡張invoke_dynamic、クラスローディングによるクラス静的メンバの動的バインディング） ラムダ式の引数の型推論 HTTPクライアント実装用API Flight recorder（Javaプログラム実行トレース用の軽快な各種データ収集フレームワーク） Unicode 10.0.0のサポート ZGC（low-latencyガーベジコレクタ）第2回試作 JSR 386にて仕様規定。アップデートで令和改元に向けたセキュリティ対策が施された。 switch文をパターンマッチング 式スタイルに拡張・第1回試作 JVM Constants API（クラスローディングに関連した仮想マシン内のクラス定数プールの操作） G1（shorter-response-timeガーベジコレクタ）用コレクション中断機能 G1（shorter-response-timeガーベジコレクタ）用不要メモリ返却機能 ZGC（low-latencyガーベジコレクタ）第3回試作 Shenandoah（low-pause-timeガベージコレクタ）第1回試作 JSR 388にて仕様規定。「数百の小粒改良、数千のバグ修正」と宣伝された。 ソケットAPIの改良実装 switch文をパターンマッチング 式スタイルに拡張・第2回試作 Text Blocks（文字列リテラルの複数行記述可能）第1回試作 ZGC（low-latencyガーベジコレクタ）第4回試作 JSR 389にて仕様規定。「数百の小粒改良、数千のバグ修正」と宣伝された。 Recordクラス（不変フィールド、標準アクセッサ、標準構築子を持つイミュータブルオブジェクト）第1回試作 instanceofパターンマッチング（if文のinstanceof判定で代入変数も同時定義できる糖衣構文）第1回試作 switch文をパターンマッチング 式スタイルに拡張・第3回試作 Text Blocks（文字列リテラル の複数行記述可能）第2回試作 Foreign-Memory Access API （仮想マシンの外部メモリにも安全にアクセスできる）第1回試作 ZGC（low-latencyガーベジコレクタ）第5回試作 JSR 390にて仕様規定。 JEP-339：Edwards-Curve デジタル署名アルゴリズム JEP-360：Sealedクラス・第1回試作（サブクラスを事前定義で固定化したクラス。オブジェクトの非交和＝直和構造を表わす） JEP-371：Hiddenクラス（フレームワーク内限定の隠されたクラス。モンキーパッチなどに応用できる） JEP-373：データグラム・ソケットAPIの改良実装 JEP-375：instanceofパターンマッチング・第2回試作 JEP-377：ZGC（low-latencyガーベジコレクタ）第6回試作 JEP-378：Text Blocks・第3回試作 JEP-379：Shenandoah（low-pause-timeガベージコレクタ）第2回試作 JEP-383：Foreign-Memory Access API・第2回試作 JEP-384：Recordクラス・第2回試作（フィールドを不変にしたクラス。オブジェクトの直積構造を表わす） JSR 391にて仕様規定。 JEP 338: ベクトルAPI JEP 347: C++14言語機能の有効化 JEP 357: MercurialからGitへの移行 JEP 369: GitHubへの移行 JEP 376: ZGC:並列スレッドスタック処理 JEP 380: UNIXドメイン・ソケット・チャネル JEP 386: Alpine Linuxポート JEP 387: Elastic Metaspace JEP 388: Windows/Aarch64ポート JEP 389: 外部リンカーAPI JEP 390: 値ベース・クラスの警告 JEP 392: パッケージング・ツール JEP 393: 外部メモリ・アクセスAPI JEP 394: instanceofのパターン・マッチング JEP 395: Records JEP 396: JDK internalをデフォルトで強固にカプセル化 JEP 397: シールド・クラス（第2プビュー） JSR 392にて仕様規定。 JEP 306: Always-Strict Floating-Point セマンティクスのリストア JEP 356: 疑似乱数ジェネレーターの強化 JEP 382: 新しいmacOSレンダリング・パイプライン JEP 391: macOS AArch64 Port JEP 398: Applet APIの廃止 JEP 403: JDK内部の強力なカプセル化 JEP 406: スイッチのパターン・マッチング（プレビュー） JEP 407: RMIアクティベーションの削除 JEP 409: シール・クラス JEP 410: 試験的AOTおよびJITコンパイラの削除 JEP 411: Security Managerの削除に向けた非推奨 JEP 412: 外部関数およびメモリAPI（インキュベーター） JEP 414: ベクトルAPI（セカンド・インキュベーター） JSR 393にて仕様規定。 JEP 400: UTF-8（デフォルト） JEP 408: Simple Web Server JEP 413: Java APIドキュメントのEPコード・スニペット JEP 416: メソッド・ハンドルによるCore Reflectionの再実装 JEP 417: Vector API（第3インキュベータ） JEP 418: インターネット・アドレス解決SPI JEP 419: 外部関数・メモリAPI（第2インキュベータ） JEP 420: Switchのパターン・マッチング（第2プレビュー） JEP 421: ファイナライズを非推奨とし削除に備える JSR 394にて仕様規定。 JEP 405: レコード・パターン（プレビュー） JEP 422: Linux/RISC-V への移植 JEP 424: 外部関数・メモリAPI（プレビュー） JEP 425: 仮想スレッド（プレビュー） JEP 426: ベクトルAPI（第4インキュベーター） JEP 427: switchのパターン・マッチング（第3プレビュー） JEP 428: 構造化された並行性（インキュベーター） JSR 395にて仕様規定。 JEP 429: スコープ値（インキュベータ） JEP 432: レコード・パターン（第2プレビュー） JEP 433: Pattern Matching for Switch（第4プレビュー） JEP 434: Foreign Function & Memory API（第2プレビュー） JEP 436: 仮想スレッド（第2プレビュー） JEP 437: 構造化された並行性（第2インキュベーター） JEP 438: ベクトルAPI（第5インキュベーター） JSR 396にて仕様規定。 JEP 430: 文字列テンプレート（プレビュー） JEP 434: Foreign Function & Memory API（第3プレビュー） JEP 439: 世代別ZGC JEP 440: レコード・パターン（第3プレビュー） JEP 441: Pattern Matching for Switch JEP 443: 無名のパターンと変数（プレビュー） JEP 444: 仮想スレッド JEP 445: 無名のクラスとインスタンス・メイン・メソッド（プレビュー） JEP 446: スコープ値（プレビュー） JEP 448: Vector API（第6インキュベーター） JEP 453: 構造化された並行性（プレビュー） Java言語では、JDK1.0以降、標準ライブラリにクラスやパッケージが多数追加されただけでなく、いくつかの変更が行われてきた。J2SE 1.4以降、Java言語の進化は、Java Community Process (JCP)によって管理されてきた。このプロセスでは、Java Specification Requests（JSR）を使用してJavaプラットフォームへの追加や変更を提案・指定している。言語はJava言語仕様書（JLS）によって規定されており、JLSへの変更はJSR 901によって管理されている。 言語の変更に加えて、Javaクラスライブラリにも長年にわたって変更が加えられ、JDK 1.0の数百クラスからJ2SE 5では3,000クラスを超えるまでに成長した。 SwingやJava2Dなどの全く新しいAPIが導入され、オリジナルのJDK 1.0のクラスやメソッドの多くが非推奨となっている。いくつかのプログラムでは、JavaプログラムをJavaプラットフォームのあるバージョンから古いバージョンに変換することができる（例えば、Java 5.0を1.4にバックポートするなど）。 Java 11と17は、現在サポートされている長期サポート（LTS）バージョン（「オラクルの顧客は、Oracle Premier Supportを提供される」）である。オラクルは、「レガシー」Java 8 LTSについて、商用利用向けには2019年1月に最後の無料の「パブリック・アップデート」をリリースしたが、それ以外の場合は、少なくとも2020年12月までは、個人利用向けのパブリック・アップデートでJava 8をサポートする。Java 10は以前サポートされていたラピッドリリース版である。Java 10のサポートは、Java 11のサポートが開始されたのと同じ日、2018年9月に終了した。Java 7はパブリックサポートが終了し、Java 9はJava 10と現在のJava 11に取って代わられた短期のラピッドリリース版であったため、アップデートの受信が停止している。Java 11以降については、長期的なアップデートはオラクルが無償で提供するものではなく、より広範なOpenJDKコミュニティが作業を行うことが期待されている。 Java 20の一般提供は2023年3月21日に行われ 、Java 21にはアーリーアクセスビルドが含まれている。