Javaは6か月ごとに新しいバージョンが出て、そのうち2年に1回の版がLTS(長期サポート版)になります。2026年10月時点のLTSは8・11・17・21・25で、最新のLTSはJava 25(2025年9月)、最新版はJava 27(2026年9月)です。

この記事では、Java 8〜27の全バージョン一覧表と、LTSごとのサポート期限を配布元別(Oracle・Eclipse Temurin・Amazon Corretto・Microsoft・Red Hat)に公式ページで確認した表(確認日:2026年10月2日)をまとめました。さらに、各LTSで増えた書き方をJava 8風とJava 21風のコードの前後比較で示し、Java 25の新機能と、削除されたAPI(Nashorn・JAXB・SecurityManager)で実際に出るエラーを OpenJDK 21.0.10 と 25.0.4.1 で実行した結果つきで解説します。最後に、どのバージョンを選ぶかの判断表を載せています。

Java バージョン一覧の早見表(LTS)

LTS リリース Oracle Premier まで Oracle Extended まで Temurin(少なくとも) 主な新機能 2026年10月時点の位置づけ
Java 8 2014年3月 2022年3月(終了) 2030年12月 2030年12月 ラムダ式、Stream、java.time 既存アプリの保守向け
Java 11 2018年9月 2023年9月(終了) 2032年1月 2027年10月 var(10)、HTTP Client、Java EE 削除 次のLTSへの移行を計画
Java 17 2021年9月 2026年9月(終了) 2029年9月 2027年10月 record、テキストブロック、sealed 移行先の検討時期
Java 21 2023年9月 2028年9月 2031年9月 2029年12月 仮想スレッド、switch パターンマッチ 安定して使える主力のLTS
Java 25 2025年9月 2030年9月 2033年9月 2031年9月 コンパクトソースファイル、モジュール import 新しく始めるなら第一候補
Java 29(予定) 2027年9月予定 2032年9月 2035年9月 ― ― 次のLTS(Oracle ロードマップ)

(Oracle Java SE Support Roadmap、Adoptium Support ページで2026年10月2日に確認)

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

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

LTS と非LTS のしくみ

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

Oracle のロードマップでは、非LTSは「直前のLTSに積み重なる改良」として扱われ、サポートは次の版が出るまでです。Temurin も Java 26 は2026年9月、Java 27 は2027年3月までと案内しています。業務の基盤には LTS、最新機能を試すなら非LTSと使い分けるのが基本です。

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)
    2027 : Java 29 (LTS予定)

Java 8〜27 全バージョン一覧

版 リリース日 LTS 主な新機能(正式機能を中心に)
8 2014-03-18 ○ ラムダ式、Stream API、java.time、Optional、インターフェースの default メソッド
9 2017-09-21 モジュールシステム(JPMS)、jshell、List.of などのファクトリメソッド
10 2018-03-20 var(ローカル変数の型推論)
11 2018-09-25 ○ HTTP Client(標準化)、String.isBlank・strip・lines・repeat、単一ファイル実行、Java EE・CORBA モジュール削除
12 2019-03-19 switch 式(プレビュー)、Shenandoah GC(実験的)
13 2019-09-17 テキストブロック(プレビュー)
14 2020-03-17 switch 式、わかりやすい NullPointerException のメッセージ
15 2020-09-15 テキストブロック、ZGC が製品機能に、Nashorn(JavaScript エンジン)削除
16 2021-03-16 record、instanceof のパターンマッチ、Stream.toList()、JDK 内部の強いカプセル化が既定に
17 2021-09-14 ○ sealed クラス、JDK 内部の強いカプセル化(--illegal-access 廃止)、SecurityManager を削除予定に
18 2022-03-22 既定の文字コードが UTF-8、簡易 Web サーバー(jwebserver)
19 2022-09-20 仮想スレッド(プレビュー)、record パターン(プレビュー)
20 2023-03-21 Scoped Values(インキュベーター)など、プレビューの改良
21 2023-09-19 ○ 仮想スレッド、switch のパターンマッチ、record パターン、シーケンスコレクション、世代別 ZGC
22 2024-03-19 無名変数 _、FFM API(外部関数・メモリ)、複数ファイルのソース実行
23 2024-09-17 Javadoc の Markdown 記法、ZGC が世代別モードを既定に
24 2025-03-18 synchronized での仮想スレッドの pinning 解消(JEP 491)、Stream Gatherers、Class-File API、SecurityManager の恒久的な無効化
25 2025-09-16 ○ コンパクトソースファイルとインスタンス main、モジュール import、柔軟なコンストラクタ本体、Scoped Values、コンパクトオブジェクトヘッダ(製品機能化)、鍵導出関数 API
26 2026-03-17 HTTP/3 対応の HTTP Client、任意の GC での AOT オブジェクトキャッシュ、Applet API 削除、G1 のスループット改善
27 2026-09-15 コンパクトオブジェクトヘッダが既定、G1 が全環境で既定の GC、TLS 1.3 のハイブリッド鍵交換(ポスト量子暗号)

(リリース日と機能は OpenJDK の各 JDK プロジェクトページ、Oracle のリリース告知をもとに整理。Java 27 の詳細は当サイトの「Java 27の新機能まとめ|値クラス(Valhalla)も解説」で解説しています)

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

Java の更新は、使う配布元(ビルドを提供する組織)によって期限が違います。 同じ Java 17 でも、Oracle の Premier Support は2026年9月で終わり、Corretto は2029年10月まで更新が続きます。

LTS Oracle Premier Oracle Extended(有償) Eclipse Temurin Amazon Corretto Microsoft Build of OpenJDK Red Hat build of OpenJDK(Full / ELS-1)
8 2022年3月 2030年12月 少なくとも2030年12月 2030年12月 提供なし(Temurin を利用) 2026年11月30日 / 2032年12月31日
11 2023年9月 2032年1月 少なくとも2027年10月 2032年1月 2027年9月 2024年10月31日 / 2032年1月31日
17 2026年9月 2029年9月 少なくとも2027年10月 2029年10月 2027年9月 2027年12月31日 / 2029年1月31日
21 2028年9月 2031年9月 少なくとも2029年12月 2030年10月 2028年9月 2029年12月31日 / 2031年9月30日
25 2030年9月 2033年9月 少なくとも2031年9月 2032年10月 2030年9月 2030年12月31日 / 2033年9月30日
配布元 確認したページ 補足
Oracle Oracle Java SE Support Roadmap Extended Support と Sustaining Support は有償契約。Sustaining は無期限
Eclipse Temurin adoptium.net の Support ページ 「少なくとも(At least)」の期限。延長されることがある
Amazon Corretto Corretto の FAQ 無償。GPLv2 + Classpath Exception
Microsoft Microsoft Learn「Support roadmap for the Microsoft Build of OpenJDK」 期限は初期目標で、延長される場合がある
Red Hat Red Hat Customer Portal「OpenJDK Life Cycle and Support Policy」 ELS(延長ライフサイクルサポート)は追加契約

参考として、BellSoft の Liberica JDK は商用サポートの期限を 8:2031年3月、11:2032年3月、17:2030年3月、21:2032年3月、25:2034年3月と公表しています(BellSoft roadmap、同日確認)。

Oracle JDK の無償利用の条件(NFTC)

Oracle JDK は、版によって無償で使える期間が決まっています(Oracle Java SE Support Roadmap より)。

版 NFTC(無償条件)での更新提供 その後
JDK 17 2024年10月で終了 OTN ライセンス(本番利用は有償契約が必要)
JDK 21 2026年9月で終了 OTN ライセンス
JDK 25 2025年9月〜2028年9月 OTN ライセンス

Oracle JDK 21 を無償で使っていた場合、2026年10月以降の更新は OTN ライセンスになります。 無償のまま更新を受けたい場合は、Oracle JDK 25 以降に上げるか、Temurin・Corretto などの OpenJDK ビルドに切り替える方法があります。ライセンスの扱いは組織のルールと Oracle の最新の案内で確認してください。

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) {} 当サイト「Java recordの使い方」
switch 式 14 case 0: s = "少"; break; case 0 -> "少"; 当サイト「Java switchパターンマッチング」
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() 当サイト「Java 仮想スレッド入門」

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

Java 25 では、書き始めの手間を減らす機能が正式になりました。OpenJDK 25.0.4.1 で実行し、同じコードを Java 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 でヒープを節約(製品機能化) 不要(JVM オプション)
AOT の改善 起動時間の短縮(-XX:AOTCacheOutput など) 不要(JVM オプション)
32ビット x86 版の削除 32ビット x86 向けのビルドがなくなった 64ビット環境へ

(Java 25 の機能一覧は OpenJDK の JDK 25 プロジェクトページで確認)

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

削除・変更された主な 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、または standalone Nashorn
16〜17 JDK 内部の強いカプセル化(--illegal-access 廃止) InaccessibleObjectException ライブラリを更新。必要なら --add-opens
18 既定の文字コードが UTF-8 Windows で Shift_JIS 前提のファイル読み込みの結果が変わる 文字コードを明示する
17 → 24 SecurityManager の非推奨化 → 恒久的な無効化 System.setSecurityManager が例外 OS・コンテナ側の権限管理
26 Applet API 削除 アプレット関連クラスが使えない ―

実行して確かめた移行時のエラー

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);
    }
}
$ java Nashorn.java          # Java 21.0.10 / 25.0.4.1 とも同じ
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)
                     ^

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 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 21 まではオプションで有効にできましたが、Java 24 以降はオプションを付けても有効にできません。 どちらの版でも、コンパイル時に warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal が出ます。

--add-opens が必要になるケース

JDK 内部の private フィールドにリフレクションで触るコード(Java 9 より前に作られたライブラリによくあります)は、Java 17 以降で例外になります。

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);
    }
}

実行結果(Java 21.0.10。25.0.4.1 でも同じ例外):

$ java AddOpens.java
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

--add-opens モジュール/パッケージ=ALL-UNNAMED を付けると動きますが、これは一時的な回避策です。 まずはライブラリを新しい版に更新し、それでも必要な場合だけ起動オプションに追加します。

移行の進め方チェックリスト

手順 やること
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 など)を外す
7. 文字コード・GC の違いを確認 UTF-8 既定化(18)、既定 GC の変化をログで確認

どのバージョンを選ぶかの判断表

状況 おすすめ 理由
これから学ぶ・新しく作る Java 25 最新LTS。Oracle Premier 2030年9月、Temurin 少なくとも2031年9月まで
利用するフレームワークが 25 にまだ対応していない Java 21 主要なライブラリの対応が進んでいる LTS
Java 17 で動いている 21 か 25 への移行を計画 Oracle Premier は2026年9月で終了。OpenJDK ビルドなら Corretto 2029年10月など
Java 11 で動いている 21 か 25 へ(17 を経由せず直接も可) Temurin・Microsoft は2027年に終了予定
Java 8 で動いている 段階的に 21 か 25 へ 更新は2030年頃まで続くが、11 での Java EE 削除など変更点が多い
最新の言語機能を試したい Java 27(非LTS) 次の版(28)が出るまでの約6か月が更新期間
長く同じ版を使い続けたい Java 25 + 長期サポートのある配布元 Corretto 2032年10月、Red Hat ELS 2033年9月 など

判断に迷ったら「LTS の中で一番新しく、使うライブラリが対応している版」を選ぶと、更新期間が長く、新機能も使えます。

インストール方法は、当サイトの「Javaインストール(Windows)|JDK 25とJAVA_HOME設定まで」で解説しています。

自分の Java のバージョンを確認する

java -version            # 実行環境の版
javac -version           # コンパイラの版
java -XshowSettings:properties -version 2>&1 | grep "java.vendor ="   # 配布元(Ubuntu の OpenJDK なら Ubuntu と表示)
// コードの中で確認する
System.out.println(Runtime.version());              // 例:25.0.4.1+1-1-24.04.4-Ubuntu
System.out.println(Runtime.version().feature());    // 例:25

java -version の1行目に LTS と付くビルドもあります(Temurin や Corretto など)。配布元は java.vendor で確認できます。

よくある質問

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

Q. Java 17 のサポートはいつまでですか? A. 配布元で異なります。 Oracle の Premier Support は2026年9月で終了し、Extended Support(有償)は2029年9月まで。Eclipse Temurin は少なくとも2027年10月、Amazon Corretto は2029年10月、Microsoft は2027年9月まで更新を提供すると案内しています(2026年10月2日確認)。

Q. Java 21 と Java 25 のどちらを選べばよいですか? A. 新しく始めるなら Java 25 が更新期間の長さで有利です。使うフレームワークやライブラリが 25 に対応していない場合は Java 21 を選び、対応を待って移行します。Java 21 の Oracle JDK を無償で使っていた場合、NFTC での更新は2026年9月で終わっている点にも注意してください。

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

まとめ

  • LTS は 8・11・17・21・25。最新 LTS は Java 25、最新版は Java 27、次の LTS は Java 29(2027年9月予定)。
  • サポート期限は配布元で違う。Java 17 は Oracle Premier が2026年9月で終了、Corretto は2029年10月まで。
  • Oracle JDK 21 の NFTC での無償更新は2026年9月で終了。無償で更新を続けるなら JDK 25 か OpenJDK ビルドへ。
  • Java 8 → 21 で、record・switch パターンマッチ・sealed・テキストブロック・var などによりコードが短く安全になった。
  • Java 25 はコンパクトソースファイル・モジュール import・柔軟なコンストラクタ本体が正式化。21 ではコンパイルエラーになることを実行して確認した。
  • 移行時は Java EE・Nashorn の削除、強いカプセル化(--add-opens)、SecurityManager の無効化に注意する。
  • 迷ったら「最新の LTS で、使うライブラリが対応している版」を選ぶ。

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

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

株式会社RJCでは、Javaのバージョンごとの違いや移行の知識を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社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で一緒に開発しながら、 成長を楽しみませんか?