12.3. Java SE 17以降のバージョンを利用するための設定

本ガイドラインでは、このドキュメントの動作検証環境に記載の通り、Spring Framework 6の動作環境に合わせJava17を使用している。
本章では、Java8からJava17、およびJava21へ移行する際に注意すべき点として、Java9以降で変更された本ガイドラインで解説している機能に関連する設定について記載している。
詳細は、各章を参照されたい。

なお、本章はOracle JDK Migration Guideに基づいて執筆している。より理解を深めるため、こちらも一読されたい。


12.3.1. Java SE 9から非推奨となったJava EE関連モジュールの削除

Java SE 9から非推奨であったJava EE関連のモジュールがJava SE 11で削除された。
詳細については、Oracle JDK Migration GuideのRemoval of Java EE and CORBA Modulesを参照されたい。
これにより、本ガイドラインで解説している機能のいくつかを正常に動作させるには、これらの代替となる依存ライブラリを追加することが必要となる。
以下に、本ガイドラインで記載のあるモジュールを紹介する。
なお、以下で解説する依存ライブラリの追加はあくまで検証の一結果に過ぎず、アプリケーションの実装(依存しているライブラリの種類)と動作環境により異なる対応が必要な場合があることに留意されたい。

12.3.1.1. JAXBの追加

Java SE 11以降でJAXBを利用する場合、jakarta.xml.bind-api及びjaxb-implが必要となる。
アプリケーションの依存ライブラリやAPサーバから提供されるライブラリにjakarta.xml.bind-api及びjaxb-implがない場合は、下記のようにpom.xmlに依存関係を追加すること。
<dependencies>
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId> <!-- (1) -->
    </dependency>
</dependencies>

<dependencies>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>${jaxb-impl.version}</version> <!-- (2) -->
        <scope>runtime</scope>
    </dependency>
</dependencies>

項番

説明

(1)
jakarta.xml.bind-apiのバージョンはterasoluna-dependenciesが依存しているSpring Bootで管理されているため、pom.xmlでのバージョンの指定は不要である。
(2)
使用する環境のJakarta EEに合わせた任意のバージョンを指定する。
Macchinetta Server Framework (1.x)ではJakarta EE 10を使用している。

12.3.1.2. Jakarta XML Web Servicesの追加

Java SE 11以降でJakarta XML Web Services(旧:JAX-WS)を利用する場合、以下のようにjakarta.xml.ws-apiを依存関係に追加する必要がある。

<dependencies>
    <dependency>
        <groupId>jakarta.xml.ws</groupId>
        <artifactId>jakarta.xml.ws-api</artifactId>
        <version>${jakarta.xml.ws.version}</version> <!-- (1) -->
    </dependency>
</dependencies>

項番

説明

(1)
jakarta.xml.ws-apiのバージョンは、Jakarta XML Web Servicesのランタイムが使用するバージョンを指定する。

なお、Jakarta XML Web Servicesのランタイムの定義に関しては、「アプリケーションの設定」 に記載を行っているので、そちらを参照されたい。


12.3.1.3. Jakarta Annotationsの追加

Java SE 11以降でCommon Annotationsを利用する場合、以下のようにjakarta.annotation-apiを依存関係に追加する必要がある。

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId> <!-- (1) -->
</dependency>

項番

説明

(1)
jakarta.annotation-apiのバージョンはterasoluna-dependenciesが依存しているSpring Bootで管理されているため、pom.xmlでのバージョンの指定は不要である。

12.3.1.4. 推移的に解決されるJava EE関連モジュールの競合

Java SE 11以降での開発を円滑に行うため、いくつかのOSSライブラリはこれまでに説明したJava SE 11で削除されたJava EE関連モジュールを依存ライブラリとして推移的に解決してくれるよう改善されている。

不幸にも、実行環境によってはこれが原因となりアプリケーションが起動しない、処理に問題が生じるといったケースがあるため、留意されたい。

具体的には、本来アプリケーションサーバのモジュールを参照していたところを部分的にアプリケーションの依存ライブラリを参照してしまい、バージョン不整合によるリンケージエラーやNoSuchMethodExceptionが発生する、エラーにはならないが期待した挙動と異なるといった不具合が発生する。
この場合は、アプリケーションのビルド時にアプリケーションサーバから提供されるモジュールを除外する、アプリケーションサーバのクラスローダ設定によりアプリケーションの依存ライブラリを優先するといった対策が有効である。

12.3.2. デフォルトで使用されるロケール・データの変更

Java SE 9以降では、Unicodeコンソーシアムの共通ロケール・データ・リポジトリ(CLDR)データがデフォルトのロケール・データとして有効化されている。

これにより、Java SE 9以降では、Java SE 8以前とは日付、時間、数値などの書式で文字列を出力した場合に結果が変わる可能性がある。

Java SE 11以降の標準の設定値から変更してJava SE 8以前と同じ書式で出力したい場合は、システム・プロパティjava.locale.providersのCLDRの前にCOMPATを設定する必要がある。(例:java.locale.providers=COMPAT,CLDR,SPI)

詳細については、Oracle JDK Migration GuideのUse CLDR Locale Data by Defaultを参照されたい。


12.3.3. HTTP通信におけるTLS(Transport Layer Security) v1.3のサポート

Java SE 11より、TLS(Transport Layer Security) バージョン1.3がサポートされ、デフォルトで1.3が使用されるようになった。

TLSのバージョンはJVMレベルで利用するバージョンを変更することが可能である。
クライアントで使用するバージョンは、JVMのシステム・プロパティjdk.tls.client.protocolsを設定することで変更可能である。
APサーバを介さずに公開するサーバで使用するバージョンは、同様にシステム・プロパティjdk.tls.server.protocolsを設定することで変更可能である。

詳細はJDK 11 Release Notesを参照されたい。

Note

LinuxのSSL通信を制御するopenssl はバージョン1.1.1でTLS 1.3に対応するが、コンパイル済みのパッケージは頒布されておらず、開発者が自らコンパイルして組み込む必要がある。

Tomcat等のミドルウェアはopensslを利用してHTTPS通信を行なうが、ミドルウェアが内包するopensslをアップデートするためには、ミドルウェア自体も再コンパイルする必要がある。同様に、opensslをアップデートすることによりOSの機能が正常に動作しなくなる可能性がある。

このため、独自にopensslをコンパイルしてアップデートすることは、一般的な開発者には推奨しない。TLS 1.3に対応したopensslを内包したOSにアップデートして、環境を構築しなおすべきである。


12.3.4. ガベージコレクションの変更

Java SE 9 以降のガベージコレクションはThe Garbage-First Garbage Collector (G1 GC) がデフォルトとなりました。

詳細はChanges to Garbage Collectionを参照されたい。