- JAVA
Javaバージョン一覧【2026年】LTSのサポート期限と違い
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期連続の黒字決算。