2026年10月16日時点で、Java の最新版は Java 27(2026年9月15日リリース、非LTS)、最新の LTS は Java 25(2025年9月16日リリース)です。LTS(長期サポート版)は 8・11・17・21・25 の5つで、次の LTS は2027年9月予定の Java 29、その前に Java 28 が2027年3月に出る予定です。

Java は3月と9月の年2回、新しい版が出ます。そのうち2年に1回の版が LTS になり、何年も更新(セキュリティ修正)が続きます。サポート期限は「どこが配布する JDK か」で違います。 同じ Java 17 でも、Oracle の Premier Support は2026年9月で終わり、Amazon Corretto は2029年10月まで更新が続きます。

まず結論:LTS のサポート期限の早見表

版 リリース Oracle(Premier / Extended) OpenJDK 系の主な期限 2026年10月時点
Java 8 2014年3月 2022年3月 / 2030年12月 Temurin・Corretto 2030年12月 保守のみ。Red Hat の通常サポートは2026年11月30日まで
Java 11 2018年9月 2023年9月 / 2032年1月 Temurin 2027年10月、Corretto 2032年1月 移行の計画を始める時期
Java 17 2021年9月 2026年9月 / 2029年9月 Temurin 2027年10月、Corretto 2029年10月 Oracle Premier が終了。移行先を決める時期
Java 21 2023年9月 2028年9月 / 2031年9月 Temurin 2029年12月、Corretto 2030年10月 主力の LTS。Oracle JDK の無償更新は2026年9月まで
Java 25 2025年9月 2030年9月 / 2033年9月 Temurin 2031年9月、Corretto 2032年10月 新しく始めるなら第一候補
Java 29(予定) 2027年9月予定 2032年9月 / 2035年9月 ― 次の LTS(Oracle ロードマップ)

(Temurin の期限は「少なくとも(At least)」の日付。配布元ごとの全項目は後半の表にあります)

確認環境:OpenJDK 8u504・11.0.32.1・17.0.20.1・21.0.10・25.0.4.1(Ubuntu 24.04 のパッケージ)で、java -version・release ファイル・クラスファイルの版・移行時のエラーを実行して確かめ、出力をそのまま載せています。Java 26・27・28 の内容とサポート期限は、Oracle Java SE Support Roadmap、Oracle JDK 26・27 リリースノート、OpenJDK の JDK プロジェクトページ、Adoptium・Amazon Corretto・Microsoft Learn・Red Hat・Azul の公式ページ、Java 28 の JEP は InfoQ の報道で確かめました(確認日 2026年10月16日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javaバージョン一覧【2026年】LTSのサポート期限とJava 27・28」

Java の最新バージョンと LTS のしくみ

用語 意味
フィーチャーリリース 6か月ごと(3月・9月)に出る新しい版(Java 26、27、28 など)
LTS(Long-Term Support) 長期間、更新が提供される版。2021年以降は2年ごと(17 → 21 → 25 → 29)
非LTS 次の版が出るまで(約6か月)だけ更新される版。Azul は STS と呼ぶ
アップデートリリース 1・4・7・10月に出る修正版(25.0.1、25.0.2 …)
プレビュー機能 正式化の前に試せる機能。--enable-preview を付けたときだけ使える

LTS は OpenJDK(Java のオープンソース実装)が決めるものではなく、Oracle などの配布元が「この版を長く更新する」と決めたものです。 実際には主要な配布元が同じ版(8・11・17・21・25)を LTS にしているため、一般に「Java の LTS」と呼ばれています。

2026年10月16日時点の「最新」

区分 版 日付 補足
最新版 Java 27 2026年9月15日 非LTS。Oracle の Premier は2027年3月まで
最新の LTS Java 25 2025年9月16日 最新アップデートは 25.0.x(四半期ごと)
次の版 Java 28 2027年3月予定 非LTS。機能の凍結は2026年12月上旬の予定(InfoQ)
次の LTS Java 29 2027年9月予定 Oracle ロードマップでは LTS
サポートが終わった非LTS Java 26 2026年3月17日 Oracle・Temurin とも2026年9月で終了
timeline
    title Java の LTS とリリース間隔
    2014 : Java 8 (LTS)
    2018 : Java 11 (LTS)
    2021 : Java 17 (LTS) : 以降は2年ごと
    2023 : Java 21 (LTS)
    2025 : Java 25 (LTS)
    2026 : Java 26 : Java 27(最新)
    2027 : Java 28(3月予定) : Java 29(9月予定・LTS)

Java バージョン一覧(Java 8〜28)

各版のリリース日・LTS かどうか・主な正式機能と JEP 番号(JDK Enhancement Proposal、機能ごとの提案番号)です。

版 リリース日 LTS 主な新機能(JEP 番号)
8 2014-03-18 ○ ラムダ式、Stream API、java.time、Optional、インターフェースの default メソッド
9 2017-09-21 モジュールシステム(261)、jshell(222)、List.of などのファクトリメソッド(269)
10 2018-03-20 var(286)
11 2018-09-25 ○ HTTP Client(321)、単一ファイル実行(330)、Java EE・CORBA モジュール削除(320)
12 2019-03-19 switch 式(プレビュー)、Shenandoah GC(実験的)
13 2019-09-17 テキストブロック(プレビュー)
14 2020-03-17 switch 式(361)、分かりやすい NullPointerException のメッセージ(358)
15 2020-09-15 テキストブロック(378)、ZGC が製品機能に(377)、Nashorn 削除(372)
16 2021-03-16 record(395)、instanceof のパターンマッチ(394)、JDK 内部の強いカプセル化が既定に(396)
17 2021-09-14 ○ sealed クラス(409)、JDK 内部の強いカプセル化(403)、SecurityManager を削除予定に(411)
18 2022-03-22 既定の文字コードが UTF-8(400)、簡易 Web サーバー jwebserver(408)
19 2022-09-20 仮想スレッド(プレビュー)、record パターン(プレビュー)
20 2023-03-21 Scoped Values(インキュベーター)など、プレビューの改良
21 2023-09-19 ○ 仮想スレッド(444)、switch のパターンマッチ(441)、record パターン(440)、シーケンスコレクション(431)、世代別 ZGC(439)
22 2024-03-19 無名変数 _(456)、FFM API(454)、複数ファイルのソース実行(458)
23 2024-09-17 Javadoc の Markdown 記法(467)、ZGC の世代別モードが既定に(474)
24 2025-03-18 仮想スレッドの pinning 解消(491)、Stream Gatherers(485)、Class-File API(484)、SecurityManager の恒久的な無効化(486)
25 2025-09-16 ○ コンパクトソースファイルとインスタンス main(512)、モジュール import(511)、柔軟なコンストラクタ本体(513)、Scoped Values(506)、コンパクトオブジェクトヘッダ(519)、鍵導出関数 API(510)
26 2026-03-17 HTTP/3 対応の HTTP Client(517)、任意の GC での AOT オブジェクトキャッシュ(516)、G1 のスループット改善(522)、Applet API 削除(504)
27 2026-09-15 G1 が全環境で既定の GC(523)、コンパクトオブジェクトヘッダが既定(534)、TLS 1.3 のポスト量子ハイブリッド鍵交換(527)、JFR のデータ秘匿(536)
28 2027年3月予定 値クラスと値オブジェクト(401、プレビュー)、Simple JSON API(540、インキュベーター)など(下の節)

(9〜25 の日付は OpenJDK の JDK プロジェクトページ、26・27 は Oracle JDK リリースノートで確かめました。12・13・19・20 は正式機能がないためプレビューを載せています)

Java 27 の新機能(2026年9月15日リリース)

Oracle JDK 27 リリースノート(build 27+35)と InfoQ のリリース記事で確かめた JEP は9件です。正式機能は4件、残り5件はプレビューかインキュベーター(試験版)です。

JEP 機能 区分 何が変わるか
523 G1 を全環境で既定の GC に 正式 CPU やメモリが少ない環境でも、既定の GC が Serial ではなく G1 になる
534 コンパクトオブジェクトヘッダを既定に 正式 Java 25 で製品機能になった省メモリのヘッダが、オプションなしで有効になる
527 TLS 1.3 のポスト量子ハイブリッド鍵交換 正式 量子計算機への備えとして、従来方式と ML-KEM を組み合わせた鍵交換を使える
536 JFR のプロセス内データ秘匿 正式 JFR(Java Flight Recorder)の記録から機密値を伏せられる
531 Lazy Constants 第3プレビュー 必要になったときに一度だけ初期化する定数
532 プリミティブ型のパターンマッチ 第5プレビュー switch や instanceof で int などを扱う
533 Structured Concurrency 第7プレビュー 複数の並行処理をひとまとまりで扱う
537 Vector API 第12インキュベーター SIMD 命令を使うベクトル演算
538 暗号オブジェクトの PEM 形式 第3プレビュー 鍵や証明書を PEM 文字列と相互変換する

リリースノートでは、削除された機能として Linux の VFORK 起動方式、ThreadPoolExecutor.finalize()、-noverify・-Xverify:none などのオプション、実験的な JVMCI(JVM Compiler Interface)が挙がっています。-Xverify:none や -noverify を起動オプションに残しているアプリは、Java 27 に上げる前に外しておくと安全です。 Java 27 の機能の詳細は、関連記事「Java 27の新機能まとめ|値クラス(Valhalla)も解説」で扱っています。

Java 28 の予定と JEP(2027年3月予定)

Oracle のロードマップでは、Java 28 は2027年3月リリースの非LTS で、Premier Support は2027年9月までです。InfoQ の報道(2026年8〜9月)では、次の JEP が Java 28 の対象(Targeted)か、対象に提案(Proposed to Target)されています。

JEP 機能 区分 状態(報道時点)
401 値クラスと値オブジェクト(Project Valhalla) プレビュー Targeted
539 JVM での厳格なフィールド初期化 プレビュー Targeted
540 Simple JSON API インキュベーター Targeted
535 Shenandoah GC の世代別モードを既定に 正式 Targeted
541 macOS/x64 ポートを削除予定に 正式 Targeted
542 暗号オブジェクトの PEM 形式 正式 Proposed to Target

JEP 401 は、Java に「値オブジェクト」(同一性を持たず、フィールドの値だけで区別されるオブジェクト)を加える、Project Valhalla の最初のプレビューです。 プレビューなので、試すには --enable-preview が要ります。Java 28 の機能は、機能の凍結(Rampdown Phase One、2026年12月上旬の予定)まで増減します。最終的な一覧は OpenJDK の JDK 28 プロジェクトページで確定します。

Intel Mac(macOS/x64)で開発している場合、JEP 541 で macOS/x64 版が「削除予定」になるため、将来の版では Apple シリコン版への移行が前提になります。

LTS の配布元別サポート期限(2026年10月16日確認)

Java の更新は、使う配布元(JDK のビルドを提供する組織)で期限が違います。 表は2つに分けています。

Oracle・Eclipse Temurin・Amazon Corretto

LTS Oracle Premier Oracle Extended(有償) Eclipse Temurin(少なくとも) Amazon Corretto
8 2022年3月(終了) 2030年12月 2030年12月 2030年12月
11 2023年9月(終了) 2032年1月 2027年10月 2032年1月
17 2026年9月(終了) 2029年9月 2027年10月 2029年10月
21 2028年9月 2031年9月 2029年12月 2030年10月
25 2030年9月 2033年9月 2031年9月 2032年10月

Microsoft・Red Hat・Azul

LTS Microsoft Build of OpenJDK Red Hat 通常サポート(Full) Red Hat ELS-1(追加契約) Azul(Core / Prime)
8 提供なし(Temurin を案内) 2026年11月30日 2032年12月31日 2030年12月
11 2027年9月 2024年10月31日(終了) 2032年1月31日 2032年1月
17 2027年9月 2027年12月31日 2029年1月31日 2029年9月
21 2028年9月 2029年12月31日 2031年9月30日 2031年9月
25 2030年9月 2030年12月31日 2033年9月30日 2033年9月
配布元 確かめたページ 期限の意味
Oracle JDK Oracle Java SE Support Roadmap Premier・Extended は有償契約のサポート。17 以降の日付は「or later(それ以降)」
Eclipse Temurin adoptium.net の Support ページ 「At least(少なくとも)」の日付。延長されることがある
Amazon Corretto Amazon Corretto FAQs 無償の更新が終わる日(End of Life)
Microsoft Build of OpenJDK Microsoft Learn「Support roadmap」 「earliest end-of-support date(最も早い終了日)」。延長されることがある
Red Hat build of OpenJDK Red Hat「OpenJDK Life Cycle and Support Policy」 RHEL 上での期限。ELS は追加契約
Azul(Zulu ビルド) Azul Support Roadmap 有償サポート(Azul Platform Core / Prime)の期限

非LTS の期限は短く、Java 26 は Oracle・Temurin とも2026年9月、Corretto は2026年10月で終わります。Java 27 は Oracle・Temurin・Azul が2027年3月、Corretto が2027年4月までです。

Java 8・11・17・21・25 の期限の違い

版 いちばん早く終わる期限 いちばん長い期限 読み方
Java 8 Red Hat 通常サポート:2026年11月30日 Red Hat ELS-1:2032年12月31日 無償ビルドは2030年12月が目安。11 での Java EE 削除など、上げるときの変更点が多い
Java 11 Microsoft:2027年9月 Oracle Extended・Corretto・Azul:2032年1月 Temurin・Microsoft は2027年で終わる。8 より先に期限が来る配布元がある
Java 17 Oracle Premier:2026年9月(終了) Oracle Extended・Azul:2029年9月 無償で使える Corretto でも2029年10月まで
Java 21 Oracle JDK の無償更新:2026年9月 Oracle Extended・Red Hat ELS-1・Azul:2031年9月 OpenJDK ビルドなら2028〜2030年まで無償の更新がある
Java 25 Microsoft・Oracle Premier:2030年9月 Oracle Extended・Red Hat ELS-1・Azul:2033年9月 今いちばん長く使える LTS

Java 11 は Java 8 より先に無償ビルドの期限が来る配布元があります(Temurin は 8 が2030年12月、11 は2027年10月)。Java 8 の期限は、長く使われてきた経緯から特別に長く設定されています。

「OpenJDK のサポート期限」とは

OpenJDK そのものには、決まったサポート期限はありません。 OpenJDK はソースコードのプロジェクトで、各配布元がそこからビルドを作り、更新の期間を決めています。jdk.java.net で Oracle が配る OpenJDK ビルド(GPL ライセンス)は、次の版が出るまでの約6か月だけ更新されます。LTS の更新を長く受けたい場合は、上の表の配布元のビルドを使います。

Oracle JDK のライセンス:NFTC と OTN の違い

Oracle JDK(Oracle が配る JDK)は、版と時期によってライセンスが変わります。NFTC は Oracle No-Fee Terms and Conditions、OTN は Oracle Technology Network License の略です。

項目 NFTC(No-Fee Terms and Conditions) OTN(Technology Network License)
無償で使える範囲 商用・本番を含め、すべての利用者 個人利用・開発・テストなど。本番の業務利用は有償契約が前提
対象 Oracle JDK 17〜25 の、決められた期間の更新 NFTC の期間が終わった後の更新、Java 8・11 の更新
期間 次の LTS が出てから1年後まで 期限の定めなし
Oracle JDK NFTC での更新 その後
17 2024年9月まで 2024年10月15日の更新から OTN
21 2026年9月まで 2026年10月のクリティカルパッチアップデート(CPU)から OTN の予定
25 2025年9月〜2028年9月 2028年9月より後の更新は OTN の予定

Oracle JDK 21 を無償で本番に使っている場合、2026年10月以降の更新は OTN ライセンスになります。 Oracle のロードマップは、無償の条件で使い続けたい利用者に Oracle JDK 25 以降への移行を案内しています。ほかの方法として、Temurin や Corretto などの OpenJDK ビルドに切り替える方法があります。OpenJDK ビルドは GPLv2 + Classpath Exception で、商用でも無償で使えます。ライセンスの扱いは、組織の方針と Oracle の最新の案内で決めます。

手元の Java のバージョンを確かめる方法

java -version の出力(JDK 8〜25)

Ubuntu 24.04 の OpenJDK で実行した結果です。

$ java -version      # JDK 8
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~24.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)

$ java -version      # JDK 11
openjdk version "11.0.32.1" 2026-08-18
OpenJDK Runtime Environment (build 11.0.32.1+1-post-1ubuntu1-24.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 11.0.32.1+1-post-1ubuntu1-24.04-Ubuntu, mixed mode, sharing)

$ java -version      # JDK 17
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-24.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-24.04-Ubuntu, mixed mode, sharing)

$ java -version      # JDK 21
openjdk version "21.0.10" 2026-01-20
OpenJDK Runtime Environment (build 21.0.10+7-Ubuntu-124.04)
OpenJDK 64-Bit Server VM (build 21.0.10+7-Ubuntu-124.04, mixed mode, sharing)

$ java -version      # JDK 25
openjdk version "25.0.4.1" 2026-08-18
OpenJDK Runtime Environment (build 25.0.4.1+1-1-24.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 25.0.4.1+1-1-24.04.4-Ubuntu, mixed mode, sharing)
見るところ 例 意味
1行目の "1.8.0_504" JDK 8 Java 8 までは 1.8 のように「1.」が付く。_504 が更新番号
1行目の "25.0.4.1" JDK 9 以降 「機能版.中間.更新.パッチ」。25 が機能版(Java 25)
1行目の日付 2026-08-18 その更新が出た日。JDK 8 では表示されない
build の後ろ Ubuntu、LTS など 配布元の情報。配布元によっては1行目に LTS と付く

JDK 8 には --version(ハイフン2つ)がありません。 JDK 8 で実行すると次のエラーになります。JDK 9 以降は java -version(標準エラーに出力)と java --version(標準出力に出力)の両方が使えます。

$ java --version     # JDK 8
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

$ java --version     # JDK 25
openjdk 25.0.4.1 2026-08-18
OpenJDK Runtime Environment (build 25.0.4.1+1-1-24.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 25.0.4.1+1-1-24.04.4-Ubuntu, mixed mode, sharing)

JAVA_HOME と PATH の java が違う版を指すことがある

java -version が見ているのは PATH の先頭にある java で、Maven や Gradle、IDE は JAVA_HOME の JDK を使います。 2つが違う版を指すと、「ターミナルでは 21 なのにビルドは 25」といったずれが起きます。

$ echo $JAVA_HOME
/usr/lib/jvm/java-25-openjdk-amd64

$ java -version 2>&1 | head -1
openjdk version "21.0.10" 2026-01-20

$ "$JAVA_HOME/bin/java" -version 2>&1 | head -1
openjdk version "25.0.4.1" 2026-08-18

$ readlink -f "$(which java)"
/usr/lib/jvm/java-21-openjdk-amd64/bin/java
OS PATH の java の場所 JAVA_HOME の確かめ方
Linux readlink -f "$(which java)" echo $JAVA_HOME
macOS /usr/libexec/java_home -V(入っている JDK の一覧) echo $JAVA_HOME
Windows(PowerShell) where.exe java echo $env:JAVA_HOME
Windows(コマンドプロンプト) where java echo %JAVA_HOME%

Linux で複数の JDK を切り替える場合は sudo update-alternatives --config java で PATH の java を選びます。Windows での JAVA_HOME の設定は、関連記事「Javaインストール(Windows)|JDK 25とJAVA_HOME設定まで」で扱っています。

release ファイルで、起動せずに版と配布元を見る

JDK のフォルダの直下にある release ファイルには、版と配布元が書かれています。サーバーに入っている JDK を、起動せずに確かめられます。

$ cat /usr/lib/jvm/java-25-openjdk-amd64/release
IMPLEMENTOR="Ubuntu"
JAVA_RUNTIME_VERSION="25.0.4.1+1-1-24.04.4-Ubuntu"
JAVA_VERSION="25.0.4.1"
JAVA_VERSION_DATE="2026-08-18"
LIBC="gnu"
MODULES="java.base java.compiler java.datatransfer ...(省略)"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=""
JDK JAVA_VERSION IMPLEMENTOR
11 11.0.32.1 Ubuntu
17 17.0.20.1 Ubuntu
21 21.0.10 Ubuntu
25 25.0.4.1 Ubuntu
8 (Ubuntu の JDK 8 パッケージには release ファイルがない) ―

IMPLEMENTOR は配布元で、Temurin なら Eclipse Adoptium、Corretto なら Amazon.com Inc. のような値になります。

プログラムの中で版を確かめる

public class VersionInfo {
    public static void main(String[] args) {
        String[] keys = {"java.version", "java.specification.version",
                         "java.vendor", "java.class.version", "java.home"};
        for (String k : keys) {
            System.out.println(k + " = " + System.getProperty(k));
        }
    }
}

各 JDK でコンパイルして実行した結果です。

JDK java.version java.specification.version java.class.version java.home
8 1.8.0_504 1.8 52.0 .../java-8-openjdk-amd64/jre
11 11.0.32.1 11 55.0 .../java-11-openjdk-amd64
17 17.0.20.1 17 61.0 .../java-17-openjdk-amd64
21 21.0.10 21 65.0 .../java-21-openjdk-amd64
25 25.0.4.1 25 69.0 .../java-25-openjdk-amd64

java.vendor はすべて Ubuntu でした。JDK 8 だけ java.home が jre フォルダを指します。 JDK 9 以降は Runtime.version().feature() で機能版の番号(25 など)を整数で取れます。

クラスファイルの版と UnsupportedClassVersionError

java.class.version の数字(52・55・61・65・69)は、その JDK が読めるクラスファイルの版の上限です。新しい JDK でコンパイルしたクラスを、それより前の JDK で動かすと UnsupportedClassVersionError になります。 JDK 25 でコンパイルしたクラスを JDK 8 と JDK 21 で実行した結果です。

$ java -cp c25 VersionInfo     # JDK 8
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: VersionInfo has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 52.0

$ java -cp c25 VersionInfo     # JDK 21
Error: LinkageError occurred while loading main class VersionInfo
    java.lang.UnsupportedClassVersionError: VersionInfo has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 65.0
クラスファイルの版 Java の版
52 Java 8
55 Java 11
61 Java 17
65 Java 21
69 Java 25

jar に入っているクラスの版は javap -v -cp アプリ.jar クラス名 | grep major で確かめられます(major version: 69 なら Java 25 向け)。新しい JDK で、前の版の Java 向けにビルドするには javac --release 8 のように --release を付けます。 JDK 25 の javac で --release 8 を付けると、ビルドはできますが次の警告が出ます。--release 7 はエラーです。

$ javac --release 8 -d r8 VersionInfo.java      # JDK 25
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings

$ javac --release 7 -d r8 VersionInfo.java      # JDK 25
error: release version 7 not supported

Maven でこのエラーが出る場合は、関連記事「release version not supportedの直し方|Maven」で扱っています。

LTS ごとの新機能をコードの前後比較で

Java 8 風と Java 21 風を並べる

在庫を表す小さなプログラムを、Java 8 までの書き方と Java 21 までの機能を使った書き方で比べます。どちらも OpenJDK 21.0.10 で実行しました。

Java 8 までの書き方(Before8.java):

import java.util.*;

// Java 8 までの書き方(Java 21 でもそのまま動く)
public class Before8 {
    static final class Item {                       // データを入れるだけのクラス
        private final String name; private final int stock;
        Item(String name, int stock) { this.name = name; this.stock = stock; }
        String name() { return name; }
        int stock() { return stock; }
        @Override public String toString() { return "Item[name=" + name + ", stock=" + stock + "]"; }
        // equals / hashCode も本来は必要
    }

    static String label(Object o) {
        if (o instanceof Item) {
            Item i = (Item) o;                      // キャストが必要
            return i.stock() == 0 ? "在庫切れ: " + i.name() : "在庫あり: " + i.name();
        }
        return "不明";
    }

    static String size(int stock) {
        String s;
        switch (stock / 10) {
            case 0: s = "少"; break;
            case 1: case 2: s = "中"; break;
            default: s = "多";
        }
        return s;
    }

    public static void main(String[] args) {
        List<Item> items = new ArrayList<>(Arrays.asList(
                new Item("ペン", 0), new Item("ノート", 15), new Item("付箋", 42)));
        String sql = "SELECT name, stock\n" +
                     "FROM item\n" +
                     "WHERE stock > 0";
        for (Item i : items) System.out.println(label(i) + " / " + size(i.stock()));
        System.out.println(sql);
        System.out.println("最後の要素: " + items.get(items.size() - 1));
    }
}

Java 21 の書き方(After21.java):

import java.util.*;

// Java 21 の書き方(var・テキストブロック・record・switch 式・パターンマッチ・sealed・SequencedCollection)
public class After21 {
    sealed interface Stockable permits Item, Bundle {}
    record Item(String name, int stock) implements Stockable {}          // Java 16
    record Bundle(String name, List<Item> items) implements Stockable {}

    static String label(Stockable s) {
        return switch (s) {                                               // Java 21 パターンマッチ
            case Item(var name, var stock) when stock == 0 -> "在庫切れ: " + name;
            case Item(var name, var stock) -> "在庫あり: " + name;
            case Bundle b -> "セット: " + b.name() + "(" + b.items().size() + "点)";
        };                                                                // sealed なので default 不要
    }

    static String size(int stock) {
        return switch (stock / 10) {                                      // Java 14 switch 式
            case 0 -> "少";
            case 1, 2 -> "中";
            default -> "多";
        };
    }

    public static void main(String[] args) {
        var items = new ArrayList<>(List.of(                              // Java 10 var
                new Item("ペン", 0), new Item("ノート", 15), new Item("付箋", 42)));
        var sql = """
                SELECT name, stock
                FROM item
                WHERE stock > 0""";                                       // Java 15 テキストブロック
        for (var i : items) System.out.println(label(i) + " / " + size(i.stock()));
        System.out.println(label(new Bundle("文具セット", items)));
        System.out.println(sql);
        System.out.println("最後の要素: " + items.getLast());              // Java 21 SequencedCollection
        System.out.println("逆順: " + items.reversed().stream().map(Item::name).toList());
    }
}

実行結果(OpenJDK 21.0.10):

$ java Before8.java
在庫切れ: ペン / 少
在庫あり: ノート / 中
在庫あり: 付箋 / 多
SELECT name, stock
FROM item
WHERE stock > 0
最後の要素: Item[name=付箋, stock=42]

$ java After21.java
在庫切れ: ペン / 少
在庫あり: ノート / 中
在庫あり: 付箋 / 多
セット: 文具セット(3点)
SELECT name, stock
FROM item
WHERE stock > 0
最後の要素: Item[name=付箋, stock=42]
逆順: [付箋, ノート, ペン]

同じ結果を、Java 21 では短く、型の安全性も高く書けます。 Item の toString を書かなくても、record が同じ形式の文字列を作っています。

機能と導入バージョンの対応表

機能 正式になった版 Java 8 風 新しい書き方
var 10 List<Item> items = ... var items = ...
テキストブロック 15 "...\n" + "..." """ で囲む
record 16 フィールド・コンストラクタ・getter・equals を手書き record Item(String name, int stock) {}
switch 式 14 case 0: s = "少"; break; case 0 -> "少";
instanceof のパターンマッチ 16 if (o instanceof Item) { Item i = (Item) o; } if (o instanceof Item i)
sealed クラス 17 継承先を制限できない sealed interface ... permits ...
switch のパターンマッチ・record パターン 21 instanceof の連続 case Item(var name, var stock) when ...
シーケンスコレクション 21 list.get(list.size() - 1) list.getLast() / list.reversed()
仮想スレッド 21 スレッドプールの本数を調整 Executors.newVirtualThreadPerTaskExecutor()

record の書き方は、関連記事「Java recordの使い方|classとの違いと実行結果で学ぶ」で扱っています。switch のパターンマッチと sealed は、関連記事「Java switchパターンマッチング|record・sealedの書き方と実例」で扱っています。仮想スレッドは、関連記事「Java 仮想スレッド入門|10万タスク実測と使いどころ判断表」で扱っています。

Java 25 の新機能(JDK 25 と 21 で実行)

Java 25 では、書き始めの手間を減らす機能が正式になりました。OpenJDK 25.0.4.1 で実行し、同じコードを 21.0.10 で実行したときのエラーも並べます。

1. コンパクトソースファイルとインスタンス main(JEP 512)

// Hello25.java
// クラス宣言も public static も不要。IO.println も使える
void main() {
    var items = List.of("ペン", "ノート", "付箋");   // java.base が自動 import される
    IO.println("Java " + Runtime.version().feature() + " / 件数=" + items.size());
}
$ java Hello25.java          # Java 25.0.4.1
Java 25 / 件数=3

$ java Hello25.java          # Java 21.0.10
Hello25.java:3: error: unnamed classes are a preview feature and are disabled by default.
void main() {
^
  (use --enable-preview to enable unnamed classes)
1 error
error: compilation failed

2. モジュール import 宣言(JEP 511)

import module java.base;   // java.util・java.nio.file・java.time などをまとめて import

public class ModuleImport25 {
    public static void main(String[] args) {
        Map<String, List<Integer>> m = new TreeMap<>();
        m.computeIfAbsent("在庫", k -> new ArrayList<>()).add(3);
        Path p = Path.of("data", "item.csv");
        System.out.println(m + " / " + p + " / " + LocalDate.of(2026, 10, 2).getDayOfWeek());
    }
}
$ java ModuleImport25.java   # Java 25.0.4.1
{在庫=[3]} / data/item.csv / FRIDAY

$ java ModuleImport25.java   # Java 21.0.10
ModuleImport25.java:1: error: '.' expected
import module java.base;   // java.util・java.nio.file・java.time などをまとめて import
             ^
1 error
error: compilation failed

3. 柔軟なコンストラクタ本体(JEP 513)

public class FlexibleCtor25 {
    static class Item {
        final String name;
        Item(String name) { this.name = name; }
    }
    static class StockItem extends Item {
        final int stock;
        StockItem(String name, int stock) {
            if (stock < 0) throw new IllegalArgumentException("stock は0以上: " + stock);  // super の前
            super(name);
            this.stock = stock;
        }
    }
    public static void main(String[] args) {
        System.out.println(new StockItem("ペン", 3).stock);
        try { new StockItem("ノート", -1); }
        catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
    }
}
$ java FlexibleCtor25.java   # Java 25.0.4.1
3
stock は0以上: -1

$ java FlexibleCtor25.java   # Java 21.0.10
FlexibleCtor25.java:10: error: call to super must be first statement in constructor
            super(name);
                 ^
1 error
error: compilation failed
Java 25 の主な変更 内容 コードの変更
コンパクトソースファイル・インスタンス main void main() だけで動く。学習や小さなスクリプト向け 新しく書くときに使える
モジュール import import module java.base; でパッケージをまとめて import 任意
柔軟なコンストラクタ本体 super(...) の前に引数チェックなどを書ける 任意
Scoped Values スレッド間で読み取り専用の値を受け渡す(ThreadLocal の代わり) 任意
コンパクトオブジェクトヘッダ -XX:+UseCompactObjectHeaders でヒープを節約(Java 27 で既定に) なし(JVM オプション)
AOT の改善 起動時間の短縮(-XX:AOTCacheOutput など) なし(JVM オプション)
32ビット x86 版の削除 32ビット x86 向けのビルドがなくなった 64ビット環境へ

バージョンを上げるときの注意点

削除・変更された主な API とモジュール

版 変更 影響 移行先
9 モジュールシステム導入、JDK 内部 API のカプセル化開始 リフレクションで内部に触るライブラリが警告 ライブラリの更新
11 Java EE・CORBA モジュール削除(JAXB、JAX-WS、javax.annotation など) javax.xml.bind などがコンパイルできない Jakarta EE のライブラリを依存関係に追加
11 JavaFX が JDK から分離 JavaFX アプリがそのままではビルドできない OpenJFX を依存関係に追加
15 Nashorn(JavaScript エンジン)削除 getEngineByName("nashorn") が null GraalJS、または単体版の Nashorn
16〜17 JDK 内部の強いカプセル化(--illegal-access 廃止) InaccessibleObjectException ライブラリを更新。必要なら --add-opens
18 既定の文字コードが UTF-8 Windows で Shift_JIS 前提のファイル読み込みの結果が変わる 文字コードを明示する
17 → 24 SecurityManager の非推奨化 → 恒久的な無効化 System.setSecurityManager が例外 OS・コンテナ側の権限管理
26 Applet API 削除、Thread.stop() 削除 関連クラス・メソッドが使えない ―
27 -noverify・-Xverify:none などのオプション削除 起動オプションに残っていると、起動時のエラーの原因になる オプションを外す

JDK 8〜25 で実行した移行時のエラー

Nashorn(Java 15 で削除):

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Nashorn {
    public static void main(String[] args) {
        ScriptEngine js = new ScriptEngineManager().getEngineByName("nashorn");
        System.out.println("nashorn エンジン = " + js);
    }
}
JDK 結果
8 nashorn エンジン = jdk.nashorn.api.scripting.NashornScriptEngine@3c0f93f1
11 Warning: Nashorn engine is planned to be removed from a future JDK release のあと、エンジンが返る
17・21・25 nashorn エンジン = null

例外ではなく null が返るため、そのあとの js.eval(...) で NullPointerException になります。

JAXB(Java 11 で削除):

$ java Jaxb.java             # import javax.xml.bind.JAXBContext; を含むコード。21・25 とも同じ
Jaxb.java:1: error: package javax.xml.bind does not exist
import javax.xml.bind.JAXBContext;   // Java 11 で JDK から削除(JEP 320)
                     ^

javax から jakarta への移行は、関連記事「javax.servlet does not existの直し方|jakarta移行」で扱っています。

SecurityManager(Java 17 で非推奨、Java 24 で恒久的に無効化):

public class SecMgr {
    public static void main(String[] args) {
        try {
            System.setSecurityManager(new SecurityManager());
            System.out.println("SecurityManager を設定しました");
        } catch (UnsupportedOperationException e) {
            System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
        }
    }
}
実行環境 結果
Java 17.0.20.1 WARNING: System::setSecurityManager will be removed in a future release などの警告のあと SecurityManager を設定しました
Java 21.0.10 UnsupportedOperationException: The Security Manager is deprecated and will be removed in a future release
Java 21.0.10 + -Djava.security.manager=allow 警告のあと SecurityManager を設定しました
Java 25.0.4.1 UnsupportedOperationException: Setting a Security Manager is not supported
Java 25.0.4.1 + -Djava.security.manager=allow 起動時に java.lang.Error: A command line option has attempted to allow or enable the Security Manager. Enabling a Security Manager is not supported.

Java 17 は警告だけで動き、Java 18〜23 は既定で例外(オプションで有効にできる)、Java 24 以降はオプションを付けても有効にできません。 どの版でも、コンパイル時に warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal が出ます。

JDK 内部へのリフレクション:8・11・17 で結果が変わる

JDK 内部の private フィールドにリフレクションで触るコード(Java 9 より前に作られたライブラリによくあります)は、版によって結果が変わります。

import java.lang.reflect.Field;

public class AddOpens {
    public static void main(String[] args) throws Exception {
        Field f = String.class.getDeclaredField("value");   // JDK 内部の private フィールド
        f.setAccessible(true);
        System.out.println("value の長さ = " + ((byte[]) f.get("abc")).length);
    }
}
JDK 結果
8 ClassCastException: [C cannot be cast to [B(Java 8 の String の中身は char[]、9 以降は byte[])
11 WARNING: An illegal reflective access operation has occurred の警告のあと、動く
17・21・25 InaccessibleObjectException(下の出力)
$ java AddOpens.java          # Java 21.0.10
Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @6591f517
    at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391)
    ...

$ java --add-opens java.base/java.lang=ALL-UNNAMED AddOpens.java
value の長さ = 3

Java 11 で警告だけだったコードが、Java 17 では例外になります。 11 → 17 以降に上げるときに起きやすいつまずきです。--add-opens モジュール/パッケージ=ALL-UNNAMED は一時的な回避策で、まずはライブラリを新しい版に更新します。詳しくは関連記事「InaccessibleObjectExceptionの直し方|Java 17」で扱っています。

版の上げ方の判断表

今の版から、どこへ上げるか

今の版 上げ先の目安 期限の目安 主なつまずき
Java 8 21 か 25(11・17 を経由せず直接も可) 無償ビルドは2030年12月。Red Hat 通常サポートは2026年11月30日 Java EE 削除、内部 API のカプセル化、String の内部表現
Java 11 21 か 25 Temurin 2027年10月、Microsoft 2027年9月 11 で警告だったリフレクションが 17 以降で例外
Java 17 21 か 25 Oracle Premier は終了。Temurin 2027年10月、Corretto 2029年10月 SecurityManager、ライブラリの対応版
Java 21 25 Oracle JDK の無償更新は2026年9月で終了。OpenJDK ビルドは2028〜2030年 25 で増えた警告、削除されたオプション
Java 25 当面そのまま。次は29(2027年9月予定) 2030年9月以降 ―
Java 26・27(非LTS) 次の版へ6か月ごとに上げる 27 は2027年3月(Corretto 4月) 上げ続ける体制が要る

状況別の選び方

状況 選ぶ版 理由
これから学ぶ・新しく作る Java 25 最新 LTS。Oracle Premier 2030年9月、Temurin 少なくとも2031年9月
使うフレームワークが 25 にまだ対応していない Java 21 主要なライブラリの対応が進んでいる LTS
Oracle JDK 21 を無償で本番に使っている Oracle JDK 25 か OpenJDK ビルドの 21 2026年10月の更新から OTN ライセンスの予定
長く同じ版を使い続けたい Java 25 + 長期の配布元 Corretto 2032年10月、Red Hat ELS-1・Azul 2033年9月
最新の言語機能を試したい Java 27(非LTS) 次の版(28)が出るまでの約6か月が更新期間
Valhalla の値クラスを試したい Java 28 の早期アクセス版 JEP 401 は Java 28 の対象(プレビュー)

判断に迷うときの目安は「LTS の中で一番新しく、使うライブラリが対応している版」です。 更新期間が長く、新機能も使えます。Spring Boot を使っている場合、Spring Boot 4 の移行手順は関連記事「Spring Boot 4移行の手順|3から4の変更点一覧とチェックリスト」で扱っています。

上げるときの手順

手順 やること
1. 依存関係を確かめる Spring Boot・Lombok・Mockito・ビルドツールなどが移行先の Java に対応した版か
2. 内部 API の利用を調べる jdeps --jdk-internals アプリ.jar で JDK 内部 API の利用箇所を一覧にする
3. 削除された API を探す jdeprscan --release 25 アプリ.jar で非推奨・削除予定の API を検出する
4. ビルド設定を更新する Maven:<maven.compiler.release>25</maven.compiler.release>、Gradle:Toolchains で languageVersion = JavaLanguageVersion.of(25)
5. テストを両方の版で回す CI で現行版と移行先の版を並行して実行する
6. 起動オプションを見直す 削除・名前が変わった JVM オプション(-Djdk.tracePinnedThreads、Java 27 の -Xverify:none など)を外す
7. 文字コード・GC の違いを確かめる UTF-8 既定化(18)、既定 GC の変化(27 で G1 が全環境の既定)をログで確かめる
8. 本番の JDK の版を記録する release ファイルの JAVA_VERSION と IMPLEMENTOR を控え、期限を管理する

JVM オプションの一覧は、関連記事「JVMオプション一覧|Xmx・Xms・GCログ設定をJava 21対応で」で扱っています。

よくある質問

Q. Java の最新バージョンはいくつですか? A. 2026年10月16日時点の最新版は Java 27(2026年9月15日リリース、非LTS)、最新の LTS は Java 25(2025年9月16日リリース)です。次は Java 28(2027年3月予定)、次の LTS は Java 29(2027年9月予定)です。

Q. Java の LTS のバージョンはどれですか? A. 8・11・17・21・25 です。 2021年以降は2年ごとで、次は29です。Java 26・27・28 は非LTS です。

Q. Java 8 のサポート期限はいつまでですか? A. Oracle Extended Support・Eclipse Temurin・Amazon Corretto・Azul はいずれも2030年12月までです。Red Hat の通常サポートは2026年11月30日で終わり、ELS-1(追加契約)は2032年12月31日までです。Microsoft は Java 8 のビルドを出しておらず、Temurin を案内しています。

Q. Java 17 のサポート期限はいつまでですか? A. 配布元で違います。 Oracle の Premier Support は2026年9月で終わり、Extended Support(有償)は2029年9月までです。Temurin は少なくとも2027年10月、Corretto は2029年10月、Microsoft は2027年9月、Red Hat の通常サポートは2027年12月31日、Azul は2029年9月までです。

Q. Java 21 のサポート期限はいつまでですか? A. Oracle の Premier Support は2028年9月、Extended Support は2031年9月です。Temurin は少なくとも2029年12月、Corretto は2030年10月、Microsoft は2028年9月、Red Hat の通常サポートは2029年12月31日、Azul は2031年9月までです。ただし Oracle JDK 21 の無償(NFTC)での更新は2026年9月で終わっています。

Q. OpenJDK のサポート期限はいつまでですか? A. OpenJDK のビルドを出している配布元ごとに決まっています。 jdk.java.net の Oracle の OpenJDK ビルドは約6か月だけ更新されます。Temurin・Corretto などは LTS を数年間更新します(上の表)。

Q. Java 27 と Java 28 は LTS ですか? A. どちらも非LTS です。 Java 27 の更新は Oracle で2027年3月まで、Java 28 は2027年3月リリース予定で、更新は2027年9月までの予定です。

Q. Java 29 はいつ出ますか? A. Oracle のロードマップでは2027年9月の予定で、LTS です。Oracle の Premier Support は2032年9月、Extended Support は2035年9月までの予定です。

Q. 自分の Java のバージョンはどう確かめますか? A. java -version を実行します。 JDK 9 以降は java --version も使えます。PATH の java と JAVA_HOME が違う JDK を指すことがあるので、ビルドで使う版は "$JAVA_HOME/bin/java" -version か、JDK フォルダの release ファイルで確かめます。

Q. 非LTS のバージョンを本番で使えますか? A. 使えますが、約6か月ごとに次の版へ上げ続ける前提になります。更新を短い間隔で回せる体制があれば最新機能を早く使え、そうでなければ LTS を選ぶのが一般的です。

まとめ

  • 最新版は Java 27(2026年9月15日)、最新 LTS は Java 25。次は Java 28(2027年3月予定)、次の LTS は Java 29(2027年9月予定)。
  • LTS は 8・11・17・21・25。サポート期限は配布元で違う。Java 17 は Oracle Premier が2026年9月で終了、Corretto は2029年10月まで。
  • Java 11 は Temurin・Microsoft で2027年に終わり、Java 8(2030年12月)より早い。 Red Hat の Java 8 通常サポートは2026年11月30日まで。
  • Oracle JDK 21 の無償(NFTC)更新は2026年9月で終了。2026年10月の更新から OTN の予定。無償で更新を続けるなら Oracle JDK 25 か OpenJDK ビルドへ。
  • Java 28 には値クラス(JEP 401、プレビュー)や Simple JSON API(JEP 540)が対象として報じられている。確定は2026年12月の機能凍結のとき。
  • 版の確かめ方は java -version、JAVA_HOME、release ファイル。 JDK 8 には --version がなく、release ファイルがないパッケージもある。
  • 移行では Java EE・Nashorn の削除、強いカプセル化(11 の警告が 17 で例外)、SecurityManager の無効化に注意する。

参考・出典

確認日はいずれも 2026年10月16日です。

  • Oracle Java SE Support Roadmap:https://www.oracle.com/java/technologies/java-se-support-roadmap.html
  • Oracle JDK 27 Release Notes:https://www.oracle.com/java/technologies/javase/27-relnote-issues.html
  • Oracle JDK 26 Release Notes:https://www.oracle.com/java/technologies/javase/26-relnote-issues.html
  • OpenJDK JDK Project(各 JDK のリリース日):https://openjdk.org/projects/jdk/
  • OpenJDK JDK 25:https://openjdk.org/projects/jdk/25/
  • OpenJDK JDK 24:https://openjdk.org/projects/jdk/24/
  • OpenJDK JDK 21:https://openjdk.org/projects/jdk/21/
  • OpenJDK JDK 27:https://openjdk.org/projects/jdk/27/
  • OpenJDK JDK 28:https://openjdk.org/projects/jdk/28/
  • InfoQ「JDK 27 and JDK 28: What We Know So Far」:https://www.infoq.com/news/2026/08/java-27-so-far/
  • InfoQ「Java 27 Released」:https://www.infoq.com/news/2026/09/java27-released/
  • Eclipse Adoptium(Temurin)Support:https://adoptium.net/support/
  • Amazon Corretto FAQs:https://aws.amazon.com/corretto/faqs/
  • Microsoft Learn「Support roadmap for the Microsoft Build of OpenJDK」:https://learn.microsoft.com/en-us/java/openjdk/support
  • Red Hat「OpenJDK Life Cycle and Support Policy」:https://access.redhat.com/articles/1299013
  • Azul Support Roadmap:https://www.azul.com/products/azul-support-roadmap/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javaバージョン一覧【2026年】LTSのサポート期限とJava 27・28」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?