Contents
1️⃣ 2024 年時点で確定しているサポートスケジュール
| 項目 | 提供元 | 支援種別 | 終了年月日 |
|---|---|---|---|
| Oracle JDK | Oracle | Premier Support(フルサポート) | 2024‑09‑30 |
| Extended Support(有償延長) | 2029‑09‑30 | ||
| OpenJDK Community ビルド (例: Eclipse Temurin) |
Eclipse Foundation | LTS ビルド (3 年間のバイナリ提供+バグ修正) | 2024‑09‑14 から 3 年間(=2027‑09‑14) |
| セキュリティパッチは 公式には保証されていない が、主要ディストリビュータはリリース後約 2‑3 年間はパッチを提供する実績がある。 | — |
ポイント
- Oracle の Premier Support は無償で利用できる期間(2024 年まで)です。その後は有償の Extended Support が必要になります。
- OpenJDK の Community ビルドは「3 年間のリリースとバグ修正」を公式に掲げていますが、セキュリティパッチの提供期間はベンダーごとに異なるため 保証はありません(Eclipse Temurin LTS ポリシー を参照)。
Java 21 のサポート見通し(2024 年 4 月現在)
- Java 21 は LTS と位置付けられていますが、Oracle が公表している 正式なサポート終了年月日は未定 です。
- 現時点では「2027 年以降に Premier Support が開始され、10 年程度の Extended Support が期待できる」ことが業界での一般的な予測ですが、公式情報が出るまでは 「予定」 として扱います。
2️⃣ Java 17 の主な新機能(実務に直結するハイライト)
| カテゴリ | 機能 | 実務メリット |
|---|---|---|
| 構文 | Switch 式 (Java 14 → 17 正式) | 値を返す式として記述でき、if‑else の煩雑さが削減。 |
テキストブロック (""") |
JSON・SQL・HTML 等の多行文字列がインデントを保ったまま埋め込める。 | |
Pattern Matching for instanceof |
型チェックとキャストが 1 行で完結し、バグリスク低減。 | |
| 型 | Record | 不変 DTO を 1 行宣言。equals / hashCode / toString が自動生成。 |
| Sealed class/interface | 継承先をコンパイル時に限定でき、安全な階層設計が可能。 | |
| API | Set.copyOf, Map.ofEntries などのコピー系メソッド |
既存コレクションから不変コレクションへ安全に変換。 |
Stream.toList() |
ストリーム結果を即座に不変リスト化、Collectors.toUnmodifiableList() の代替。 |
|
Date‑Time API 拡張 (DateTimeFormatterBuilder) |
ローカライズや柔軟なフォーマット構築がシンプルになる。 | |
| ガベージコレクタ | ZGC, Shenandoah が正式サポート (JDK 17) | 大規模ヒープでも低遅延 GC が利用可能。 |
2‑1️⃣ コード例まとめ
Switch 式 + テキストブロック
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
String statusMsg = switch (statusCode) { case 200 -> "OK"; case 400, 401 -> "Client Error"; case 500 -> "Server Error"; default -> "Unknown"; }; String sql = """ SELECT id, name, created_at FROM users WHERE status = ? ORDER BY created_at DESC """; |
Record & Sealed class
|
1 2 3 4 5 6 7 8 9 10 11 |
public record UserDto(Long id, String name, String email) {} public sealed interface Payment permits CreditCard, PayPal {} final class CreditCard implements Payment { private final String number; } final class PayPal implements Payment { private final String accountId; } String desc = switch (payment) { case CreditCard c -> "カード番号: " + c.number(); case PayPal p -> "PayPal アカウント: " + p.accountId(); }; |
Pattern Matching for instanceof
|
1 2 3 4 5 6 7 8 |
Object payload = fetch(); if (payload instanceof String s) { System.out.println("文字列長: " + s.length()); } else if (payload instanceof List<?> list) { System.out.println("要素数: " + list.size()); } |
新 API の活用例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Set<String> roles = Set.of("ADMIN", "USER"); Map<Integer, String> errMap = Map.ofEntries( Map.entry(400, "Bad Request"), Map.entry(404, "Not Found") ); List<String> upperNames = names.stream() .map(String::toUpperCase) .toList(); // → 不変リスト DateTimeFormatter fmt = new DateTimeFormatterBuilder() .appendPattern("yyyy/MM/dd HH:mm") .parseCaseInsensitive() .toFormatter(Locale.JAPAN); String now = LocalDateTime.now().format(fmt); |
3️⃣ 移行手順 ― 開発環境・CI/CD の具体的な設定
3‑1️⃣ SDKMAN! で JDK 17 をインストール&切替
|
1 2 3 4 5 6 7 8 9 10 |
# SDKMAN! 本体の導入(初回のみ) curl -s "https://get.sdkman.io" | bash # OpenJDK 17 (Eclipse Temurin) のインストール例 sdk install java 17.0.12-tem # プロジェクト単位でバージョン固定 (.sdkmanrc) echo "17.0.12-tem" > .sdkmanrc sdk env # .sdkmanrc があるディレクトリで自動切替 |
- CI 例(GitHub Actions)
yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup SDKMAN!
run: curl -s "https://get.sdkman.io" | bash && source "$HOME/.sdkman/bin/sdkman-init.sh"
- name: Install JDK 17
run: sdk install java 17.0.12-tem && sdk use java 17.0.12-tem
- name: Build with Maven
run: mvn -B clean verify
3‑2️⃣ ビルドツールの設定変更
| ツール | 設定箇所 | 例 |
|---|---|---|
| Maven | pom.xml → maven-compiler-plugin |
xml<br><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>17</source><target>17</target></configuration></plugin> |
| Gradle (Groovy DSL) | build.gradle |
groovy<br>java { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 } |
| Gradle (Kotlin DSL) | build.gradle.kts |
kotlin\njava { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 }\n |
- プラグインバージョン
- Maven:
maven-surefire-plugin ≥ 3.0.0-M5(JUnit 5 推奨) - Gradle Wrapper (
gradlew) は最新版 (7.x 系) に更新し、ビルドサーバでも同一 JDK が使われるようにする。
3‑3️⃣ JPMS(モジュールシステム)への影響
module-info.javaがある場合はrequires transitiveの見直し と、record・sealedをエクスポート対象に含める必要があります。- コンパイル例:
javac --release 17 -d out $(find src -name "*.java") - テスト時に内部 API が必要な場合は
--add-opensオプションを限定的に使用し、本番環境ではモジュール境界を厳守します。
3‑4️⃣ 互換性チェックツール
| ツール | 用途 | 実行例 |
|---|---|---|
| jdeps | API 使用状況・内部パッケージ参照の可視化 | jdeps --module-path out -cp out/main.jar -summary target/classes |
| Maven Enforcer | ビルド時に JDK バージョンを強制 | xml<br><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-enforcer-plugin</artifactId><version>3.2.1</version><executions><execution><goals><goal>enforce</goal></goals></execution></executions><configuration><rules><requireJavaVersion><version>[17,)</version></requireJavaVersion></rules></configuration></plugin> |
| Gradle Versions Plugin | 依存ライブラリの最新版チェック(JDK 17 で動作保証) | ./gradlew dependencyUpdates |
4️⃣ 実務導入時に注意すべきリスクとベストプラクティス
4‑1️⃣ テスト自動化で回帰を防ぐ
- CI に JDK 17 を組み込む:全テスト(単体・統合・E2E)を JDK 17 環境で実行し、バージョン差異による挙動変化を早期に検出。
- JUnit 5 + Mockito の最新版 を使用し、
java.time系 API 変更やsealed/recordに対するテストコードも併せてカバー。
4‑2️⃣ デプロイ環境での JDK 統一
| 手段 | 実装例 |
|---|---|
| Docker イメージ | FROM eclipse-temurin:17-jdk-slim(公式 OpenJDK 画像) |
| Kubernetes | imagePullPolicy: IfNotPresent → 同一イメージがステージング・本番で共有されることを保証。 |
| パッケージマネージャ (Ubuntu) | apt-get install -y openjdk-17-jdk && apt-mark hold openjdk-17-jdk(自動アップデート防止) |
4‑3️⃣ セキュリティパッチ管理
- Oracle の CPUS(Critical Patch Update)スケジュール をカレンダーに登録(例: 2024‑04、2024‑07)。
- Eclipse Temurin の LTS ビルドは GitHub リポジトリの「Releases」ページでパッチ情報が公開されるので、
sdk upgrade javaコマンドで定期的に最新版へ更新。 - パッチ適用後は必ず 回帰テスト と Docker イメージ再ビルド を行う。
5️⃣ 最新リリース情報(Oracle OpenJDK)
| バージョン | リリース日 | 主な修正点 |
|---|---|---|
| Java 17.0.1 | 2022‑10‑19 | CVE‑2022‑22576 等のセキュリティパッチ、JFR 安定化 |
| Java 17.0.2 | 2023‑01‑17 | G1 GC スループット向上、ZGC バグ修正、Flight Recorder 機能拡張 |
| Java 17.0.3 | 2023‑04‑18 | Windows AArch64 のパフォーマンス改善、JDK デバッグ情報更新 |
| Java 17.0.4 | 2023‑07‑18 | JFR イベント追加、JEP 411 (Deprecate the Security Manager) の警告強化 |
詳細は Oracle の公式リリースノートを参照してください。
- Oracle Java SE Release Notes: https://www.oracle.com/java/technologies/javase/release-notes.html
6️⃣ 参考リンク(信頼できる公式情報)
| 項目 | URL |
|---|---|
| Oracle の LTS サポートロードマップ | https://www.oracle.com/java/technologies/java-se-support-roadmap.html |
| Eclipse Temurin (Adoptium) LTS ポリシー | https://adoptium.net/support/ |
| JDK 17 Official Release Notes | https://www.oracle.com/java/technologies/javase/17-relnotes.html |
| OpenJDK 17 Feature Summary (JEP一覧) | https://openjdk.org/projects/jdk/17/ |
| Maven Enforcer Plugin – requireJavaVersion | https://maven.apache.org/enforcer/enforcer-rules/requireJavaVersion.html |
| Gradle Dependency Updates Plugin | https://github.com/ben-manes/gradle-versions-plugin |
7️⃣ まとめ ― Java 17 LTS を選ぶべき理由
- サポートが確定
- Oracle Premier Support は 2024 年まで、Extended Support が 2029 年まで提供。
-
コミュニティビルドでも少なくとも 3 年間のバイナリ供給とバグ修正が期待できる。
-
実務に直結する新機能
- Switch 式・テキストブロックでコード量削減。
- Record / Sealed class による安全かつ簡潔なデータモデル設計。
-
Stream.toList()などの API 追加で可読性向上。 -
移行コストが低い
- SDKMAN!・Maven/Gradle の設定変更だけで環境統一が可能。
-
JPMS が必須ではないため、既存プロジェクトへの影響は最小限に抑えられる。
-
長期的なリスク低減
- 定期パッチ適用とテスト自動化でセキュリティ脆弱性を速やかに解消。
結論:2024 年以降も安定した運用基盤が必要なら、Java 17 LTS を採用し、Premier Support が終了する 2024 年までに有償の Extended Support(またはコミュニティビルド)への移行計画を策定 することが最も現実的かつリスクの少ない選択です。
本稿は Oracle の公式サポート情報、Eclipse Temurin の LTS ポリシー、および OpenJDK の公開資料に基づいて作成しています。