2026.10.23

【2026年版】Java 8から21・25へのバージョンアップ手順|10月の脆弱性とjavax→jakartaの移行

はじめに

この記事では、Java 8 で動いているシステムを、LTS の Java 21・25 に上げる手順をまとめました。Java 11・17 からの場合はJava 11・17 から 21・25 へのバージョンアップ手順をどうぞ。

まず:2026 年 10 月の Java の脆弱性

2026 年 10 月 20 日(米国時間)、Oracle が定例のセキュリティ更新を公開しました。Java SE だけで 55 件の修正があり、そのうち 49 件はログインなしでネットワークから悪用できるおそれがあります。IPA も 10 月 21 日に「早急に更新を」と呼びかけています。

  • 深刻度は最大で CVSS 7.5。条件しだいで、アプリが止まる・データを読まれる・乗っ取られるおそれがあります
  • さらに翌日の 10 月 21 日、証明書まわりの深刻度 9.1 の脆弱性(CVE-2026-91403)が定例外で公表されました。定例の修正版も対象に入っているので、続報を確認しましょう
バージョン10 月の修正版(Oracle JDK)Eclipse Temurin のサポート
25(LTS)25.0.52031 年 9 月以降まで
21(LTS)21.0.132029 年 12 月以降まで
17(LTS)17.0.212027 年 10 月以降まで
11(LTS)11.0.332027 年 10 月以降まで
8(LTS)8u5112030 年 12 月以降まで
26なし(2026 年 9 月で終了)終了

修正版の番号は Oracle JDK のものです。Eclipse Temurin・Amazon Corretto など、ほかの配布元の JDK は、それぞれの配布元の更新を確かめてください。

「どの JDK を使っているか」も確かめる

Java は、同じバージョンでも配布元によって無償で更新が受けられる期間が違います。Oracle JDK は、無償で使える条件がバージョンや時期によって変わり、たとえば Oracle JDK 21 の無償での更新は 2026 年 9 月で終わったとされています。会社で使うなら、無償で長く更新が出る Eclipse Temurin や Amazon Corretto などに切り替えるのも、バージョンアップと合わせて考えましょう。

今から上げるなら 25、難しければ 21

今から上げるなら、最新の LTS の Java 25 がおすすめです。使っているフレームワークやライブラリがまだ 25 に対応していなければ、Java 21 にしましょう。26・27 のような LTS ではないバージョンは、半年でサポートが終わるので、業務システムには向きません。

Java 8 からは「フレームワークごと」の移行になる

Java 8 から 21・25 の間には、Java 9 のモジュールのしくみ、Java 11 での Java EE のモジュールの削除、Java 18 での既定の文字コードの変更など、大きな変更がいくつもあります。

さらに、Java 8 のシステムは Spring Boot 2 系や javax の API を使っていることが多く、新しい Java に合わせるとフレームワークも上げることになります。Spring Boot 3 以降は Java 17 以上が必要で、パッケージ名が javax.* から jakarta.* に変わるので、Java とフレームワークを一緒に上げるつもりで計画しましょう。

バージョンアップの流れ

  1. 今の環境を調べる:JDK の配布元とバージョン、ビルドツール(Maven・Gradle)、フレームワークとアプリケーションサーバー
  2. ツールで問題の箇所を洗い出す:jdeps・jdeprscan
  3. ビルドツールとライブラリを上げる:Maven・Gradle のプラグイン、Lombok などコンパイル時に動くもの
  4. 新しい JDK でビルドし、テストを通す
  5. フレームワークを上げる(Spring Boot 2 → 3 → 4 など)
  6. 本番を切り替える:JVM のオプションも見直す

ツールで問題の箇所を洗い出す

JDK に付いている 2 つのツールで、新しい Java で問題になりそうな箇所を調べられます。どちらも新しい JDK(21・25)のものを使います。

bash
# JDK の内部 API(sun.* など)を使っている箇所を調べる
jdeps --jdk-internals --multi-release 25 -cp 'lib/*' target/app.jar

# 削除予定・削除済みの API を使っている箇所を調べる
jdeprscan --release 25 target/app.jar

コードの自動の書き換えには「OpenRewrite」というツールもあります(Java 8 から新しい版への移行や、Spring Boot 3 への移行の書き換えが用意されています)。

つまずきやすいところ

Java 11:JAXB など Java EE のモジュールが削除された

Java 8 には入っていた JAXB(XML の変換)・JAX-WS(SOAP)・javax.annotation などが、Java 11 で JDK から削除されました。ClassNotFoundException: javax.xml.bind.JAXBContext のようなエラーが出たら、これが原因です。ライブラリとして足します。

pom.xml
<!-- JAXB を使っている場合(jakarta 版) -->
<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>4.0.2</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>4.0.5</version>
</dependency>

Java Web Start とブラウザのプラグイン(アプレットを動かすもの)は Java 11 で無くなり、JavaFX も JDK に入らなくなりました。JavaFX は OpenJFX として別に入れます。

Java 9〜17:内部 API が使えなくなった

sun.misc.BASE64Encoder のような JDK の内部 API は、Java 9 から段階的に封じ込められ、Java 17 では原則使えなくなりました。古いライブラリがリフレクションで内部に触っていると、InaccessibleObjectException で止まります。

  • 自分のコードなら、公開されている API に書き換える(例: sun.misc.BASE64Encoder → java.util.Base64)
  • ライブラリが原因なら、新しいバージョンに上げる(古い Lombok・Spring・Hibernate・Mockito などでよく起きる)
  • どうしても直せないときだけ、--add-opens java.base/java.lang=ALL-UNNAMED のような起動オプションで一時的に開ける

Java 18:既定の文字コードが UTF-8 に

日本語のシステムでいちばん注意したい変更です。Java 17 までは、日本語版 Windows では既定の文字コードが MS932(Shift_JIS)でした。Java 18 からは OS に関係なく UTF-8 になります。

ファイルを読み書きするときに文字コードを指定していないコード(new FileReader(file) など)は、Java を上げただけで文字化けします。文字コードを指定するように直すのが基本です。

Java
// 文字コードを指定していない(Java 18 から UTF-8 で読まれる)
Reader r = new FileReader(file);

// 文字コードを指定する
Reader r = Files.newBufferedReader(file.toPath(), Charset.forName("MS932"));

すぐに直せない場合は、起動オプション -Dfile.encoding=COMPAT で以前の動きに戻せます。

Java 9:日付や数値の書式が変わった

Java 9 から、日付・数値・曜日などの書式のデータが CLDR(Unicode の標準のデータ)になりました。SimpleDateFormat や DateTimeFormatter で、曜日や午前・午後の表記などが変わることがあります。帳票や CSV の出力を、新旧で見比べましょう。

そのほか

  • Java のバージョンの表記が 1.8.0_xxx から 21.0.x のような形に変わった。バージョンの文字列を読んで処理しているコードは要注意
  • JavaScript のエンジン(Nashorn)が Java 15 で削除された
  • Security Manager が Java 24 で使えなくなった
  • 既定の GC が G1 になった(Java 9)。メモリまわりの JVM のオプションも見直す

Spring Boot を使っている場合

Spring Boot 2 系はすでに無償のサポートが終わっています。Java を上げるときに、Spring Boot も上げましょう。

  • Spring Boot 3:Java 17 以上。パッケージ名が javax.* から jakarta.* に変わる(javax.servlet → jakarta.servlet、javax.persistence → jakarta.persistence など)
  • Spring Boot 4:Java 17 以上で、Java 25 にも対応。Jakarta EE 11 が土台。3 系で非推奨だったものは削除された
  • いきなり 4 にせず、まず 2.7 → 3 系、それから 4 系と段階を踏むと、エラーの原因を切り分けやすい

javax から jakarta への書き換えは、自分のコードだけでなく、使っているライブラリ(Tomcat は 10 以降が jakarta)もそろえる必要があります。

本番を切り替えるときの注意

  • JVM の起動オプションを見直す:Java 8 の -XX:PermSize など、新しい Java では使えないオプションがあると起動しない
  • 文字化けがないか確かめる:ファイル・CSV・帳票の出力を、新旧で見比べる
  • JDK の配布元を決める:無償で更新を受けたいなら、Eclipse Temurin・Amazon Corretto など
  • 切り戻しの手順を用意する:古い JDK にすぐ戻せるようにしてから切り替える

まとめ

  • 2026 年 10 月の定例更新で、Java SE の脆弱性 55 件が修正された
  • 上げる先は Java 25、難しければ 21(LTS を選ぶ)
  • Java 8 からは Java EE のモジュールの削除・内部 API の封じ込め・既定の文字コードの UTF-8 化に注意
  • Spring Boot を使っているなら、javax から jakarta への移行とセットで計画する

Node.js のバージョンアップは古い Node.js から LTS(24・26)へのバージョンアップ手順にまとめています。

参考

Oracle・OpenJDK・Adoptium の公式の情報、Spring Boot の公式ドキュメント、国内の報道(2026 年 10 月 23 日時点)をもとにまとめています。

Oracle Critical Patch Update Advisory - October 2026

Eclipse Temurin のサポート期限 - Adoptium

「Oracle Java SE」にも致命的な脆弱性 - 窓の杜

JEP 400: UTF-8 by Default - OpenJDK

JEP 320: Remove the Java EE and CORBA Modules - OpenJDK

System Requirements - Spring Boot 4.0

TFT
soflan108本の記事