WebSphere Liberty/Open Liberty：今年一年の新機能まとめ

OSSのJava EE / [Jakarta EE](https://jakarta.ee/) / [MicroProfile](https://microprofile.io/)の実行ランタイムである[Open Liberty](https://openliberty.io/)，およびその製品版である[WebSphere Liberty](https://www.ibm.com/jp-ja/products/cloud-pak-for-applications/liberty)は，4週間ごとに新しいFixpackが公開されバージョンが更新されます。ことしは，1月の[v24.0.0.1](https://www.ibm.com/support/pages/node/7109802)から12月の[v24.0.0.12](https://www.ibm.com/support/pages/node/7176922)までの12の新しいバージョンが公開されました。

この記事では，今年公開されたFixpackでの新機能をまとめてご紹介します。

Libertyは，継続的シングルストリームで提供されており，メジャーバージョンアップによるFixpackストリームの切り替えはありません。単一のバージョン・ストリームとしてFixpackが提供され続けます。機能追加についても数年の一度のメジャーバージョンアップでとかではなく，それぞれのFixpackごとに，新機能が随時リリースされます。

それでも，[ゼロマイグレーション・ポリシー](https://www.ibm.com/docs/ja/was-liberty/base?topic=overview-liberty-zero-migration-architecture)によって，Fixpack適用時のアプリケーションや構成ファイルのマイグレーションは，原則として不要となっています。ただ，この[ゼロマイグレーション・ポリシーにも例外があり](https://community.ibm.com/community/user/wasdevops/blogs/takakiyo-tanaka1/2024/10/10/liberty-zero-migration-exception?CommunityKey=d6c93aa2-6e10-48da-96dc-3831da8ee185)，今年は[脆弱性の修正が目的のデフォルトの変更](https://www.ibm.com/support/pages/node/7168472/)が行われました。

# 新仕様への対応

## Java SE 22対応(v24.0.0.4) / 23対応(v24.0.0.10)

LTSではないJava SE仕様の更新であるJava SE 22/23に，それぞれJava SE仕様の公開直後のLibertyの更新で対応しています。

IBMのOpenJDKディストリビューションであるSemeru Runtimesも，Java 23からは日を置かずに更新されるようになり，新しいJava SE仕様をいち早く試せるようになっています。

## MicroProfile Reactive Messaging 3.0対応(v24.0.0.2) 

MicroProfile Reactive Messaging 3.0 `mpReactiveMessaging-3.0` および MicroProfile Streams Operators 3.0 `mpReactiveStreams-3.0` の二つのFeatureがv24.0.0.2で追加されました。

MicroProfile Reactive Messaging 3.0 では，否定応答，エミッター，バックプレッシャーのサポートなど，Libertyが従来提供していたMicroProfile Reactive Messaging 1.0からの多数の新機能と変更が導入されています。また，従来の1.0はJava EEのjavax名前空間で提供されていましたが，3.0はJakarta EE 9以降のjakarta名前空間と互換性があります。

またLibertyではMicroProfile Reactive Messagingで使用するKafkaコネクターを提供し，Kafkaを仲介してメッセージを送受信することができます。

詳細については，[v24.0.0.2公開時のBlog](https://openliberty.io/ja/blog/2024/02/27/24.0.0.2.html)（[日本語](https://openliberty.io/ja/blog/2024/02/27/24.0.0.2.html)，[英語](https://openliberty.io/blog/2024/02/27/24.0.0.2.html)）を参照ください。

## MicroProfile Telemetry 2.0対応(v24.0.0.9)

MicroProfile Telemetry 2.0 (`mpTelemetry-2.0`) Featureがv24.0.0.9で追加されました。このFeatureでは，OpenTelemetryを使用して標準化された方法でログ，メトリクス，トレースを収集およびエクスポートすることで、Javaアプリケーションの可観測性を向上させます。以前のバージョンのMicroProfile Telemetryは，分散トレースのみを管理できました。

詳細については，[v24.0.0.9公開時のBlog](https://openliberty.io/ja/blog/2024/09/10/24.0.0.9.html)（[日本語](https://openliberty.io/ja/blog/2024/09/10/24.0.0.9.html)，[英語](https://openliberty.io/blog/2024/09/10/24.0.0.9.html)）を参照ください。

## MicroProfile 7.0対応(v24.0.0.12)

8月に公開された[MicroProfile 7.0](https://microprofile.io/compatible/7-0/)に対応しました。

MicroProfile 7.0では，v24.0.0.9で対応した[MicroProfile Telemetry 2.0](https://microprofile.io/specifications/telemetry/2-0/)のほか，[Open API 4.0](https://microprofile.io/specifications/open-api/3-1/)，[Rest Client 4.0](https://microprofile.io/specifications/rest-client/4-0/)，[Fault Tolerance 4.1](https://microprofile.io/specifications/fault-tolerance/4-1/)の更新が含まれています。

また，（おそらくJakarta EE 11仕様の公開の遅れに対応するためですが）特定のバージョンのJakarta EE Core Profileに依存しなくなりました。MicroProfile 7.0は，Jakarta EE 10以降のCore Profileに対応するようになっています。

MicroProfile 7.0の新機能については[OpenLiberty.ioのBlog(英語)](https://openliberty.io/blog/2024/12/03/microprofile-7.html)を参照ください。

# コンテナ対応の強化

## InstantOn対応Featureの追加(v24.0.0.1/24.0.0.6/24.0.0.11)

[Liberty InstantOn](https://openliberty.io/docs/latest/instanton.html)は，コンテナ環境でLibertyの起動を高速化する機能です。LinuxカーネルのCheckpoint/Restore In Userspace(CRIU)機能を使用して，起動済みのLibertyプロセスの状態をコンテナイメージ内のファイルに保存(Checkpoint)し，ファイルからプロセスを復帰(Restore)することで数十〜数百ミリ秒でのサーバーの起動を可能にします。Nativeアプリケーションにコンパイルする高速起動技術と異なり，InstantOnはJavaの全機能を利用できるという大きなメリットがあります。

InstantOnは，2023年の6月に正式版となり，現在icr.ioで公開されているOpen Libery/WebSpehre Libertyのオフィシャルイメージで利用が可能になっています。

昨年の初期のバージョンではWeb ProfileのAPIを中心とした一部のFeatureのみがInstantOn対応でしたが，今年の更新で何度か利用可能なFeatureが追加されています。

1月のv24.0.0.1では，以下のFeatureが利用可能になりました。

- `jaxws-2.2` [Java Web Services 2.2](https://openliberty.io/docs/latest/reference/feature/jaxws-2.2.html)
- `xmlWS-3.0` [Jakarta XML Web Services 3.0](https://openliberty.io/docs/latest/reference/feature/xmlWS-3.0.html)
- `xmlWS-4.0` [Jakarta XML Web Services 4.0](https://openliberty.io/docs/latest/reference/feature/xmlWS-4.0.html)
- `jdbc-4.1` [Java Database Connectivity 4.1](https://openliberty.io/docs/latest/reference/feature/jdbc-4.1.html)
- `jdbc-4.3` [Java Database Connectivity 4.3](https://openliberty.io/docs/latest/reference/feature/jdbc-4.3.html)
- `appSecurity-1.0` [Application Security 1.0](https://openliberty.io/docs/latest/reference/feature/appSecurity-1.0.html)
- `javaMail-1.6` [Java Mail 1.6](https://openliberty.io/docs/latest/reference/feature/javaMail-1.6.html)
- `mail-2.0` [Jakarta Mail 2.0](https://openliberty.io/docs/latest/reference/feature/mail-2.0.html)
- `mail-2.1` [Jakarta Mail 2.1](https://openliberty.io/docs/latest/reference/feature/mail-2.1.html)
- `passwordUtilities-1.0` [Password Utilities 1.0](https://openliberty.io/docs/latest/reference/feature/passwordUtilities-1.0.html)
- `localConnector-1.0` [Admin Local Connector 1.0](https://openliberty.io/docs/latest/reference/feature/localConnector-1.0.html)

6月のv24.0.0.6では，以下のFeatureが利用可能になりました。

- `messaging-3.0` [Jakarta Messaging 3.0](https://openliberty.io/docs/latest/reference/feature/messaging-3.0.html)
- `messaging-3.1` [Jakarta Messaging 3.1](https://openliberty.io/docs/latest/reference/feature/messaging-3.1.html)
- `connectors-2.0` [Jakarta Connectors 2.0](https://openliberty.io/docs/latest/reference/feature/connectors-2.0.html)
- `connectors-2.1` [Jakarta Connectors 2.1](https://openliberty.io/docs/latest/reference/feature/connectors-2.1.html)
- `mdb-4.0` [Jakarta Enterprise Beans Message-Driven Beans
4.0](https://openliberty.io/docs/latest/reference/feature/mdb-4.0.html)
- `sessionCache-1.0` [JCache Session Persistence
1.0](https://openliberty.io/docs/latest/reference/feature/sessionCache-1.0.html)

11月のv24.0.0.11では，以下のFeatureが利用可能になりました。

- `wasJmsClient-2.0` [JMS Client for Message Server 2.0](https://openliberty.io/docs/latest/reference/feature/wasJmsClient-2.0.html)
- `messagingClient-3.0` [Messaging Server Client
3.0](https://openliberty.io/docs/latest/reference/feature/messagingClient-3.0.html)
- `wasJmsServer-1.0` [Message Server 1.0](https://openliberty.io/docs/latest/reference/feature/wasJmsServer-1.0.html)
- `messagingServer-3.0` [Messaging Server
3.0](https://openliberty.io/docs/latest/reference/feature/messagingServer-3.0.html)
- `messagingSecurity-3.0` [Messaging Server Security
3.0](https://openliberty.io/docs/latest/reference/feature/messagingSecurity-3.0.html)
- `jacc-1.5` [Java Authorization Contract for Containers 1.5](https://openliberty.io/docs/latest/reference/feature/jacc-1.5.html)
- `appAuthorization-2.0` [Jakarta Authorization 2.0](https://openliberty.io/docs/latest/reference/feature/appAuthorization-2.0.html)
- `appAuthorization-2.1` [Jakarta Authorization 2.1](https://openliberty.io/docs/latest/reference/feature/appAuthorization-2.1.html)

## SpringBootアプリケーションのInstantOn対応(v24.0.0.6)

Spring Bootバージョン3.2以上およびSpring Framework 6.1以上は，Coordinated Restore at Checkpoint (CRaC) サポートをふくみ，CRIUをつかった起動の高速化に対応できるようになっています。Libertyでは新たに[Coordinated Restore at Checkpoint (CRaC)](https://openliberty.io/docs/latest/reference/feature/crac-1.4.html) (`crac-1.4`) Featureを提供し，Liberty InstantOnとSpring Bootを組合わせることができるようになりました。

たとえばSpring Boot 3.2を使用したアプリケーションをLiberty InstantOnで使用するには，以下のように構成します。なお，Spring Boot 3.xの実行にはJava 17以降のJDK/JREが必要です。

```xml:server.xml
<features>
   <feature>springBoot-3.0</feature>
   <feature>servlet-6.0</feature>
   <feature>crac-1.4</feature>
</features>
```

Spring BootのInstantOn有効化についての詳細な情報は，[Liberty Blogの記事(英語)](https://openliberty.io/blog/2023/09/26/spring-boot-3-instant-on.html)を参照ください。

## コンテナイメージの追加(v24.0.0.1)

昨年9月に公開されたLTSのJava SE仕様，Java 21を使用したコンテナイメージが今年1月から追加されました。Java 21を使用したコンテナイメージは，[Universal Base Image(UBI)のminimal版が使用されるようになり，使用されているJREも(JDKより)サイズをスリム化](https://openliberty.io/blog/2024/02/05/Java21-Images.html)した結果，400Mバイト強と従来のイメージよりもサイズが小さくなっています。

```console
% podman images                                                        
REPOSITORY                        TAG                               IMAGE ID      CREATED       SIZE
icr.io/appcafe/websphere-liberty  kernel-java8-ibmjava-ubi          d9cd90e97007  35 hours ago  487 MB
icr.io/appcafe/websphere-liberty  kernel-java8-openj9-ubi           2c2aa97d4152  35 hours ago  545 MB
icr.io/appcafe/websphere-liberty  kernel-java11-openj9-ubi          3f826214acbe  35 hours ago  707 MB
icr.io/appcafe/websphere-liberty  kernel-java17-openj9-ubi          2e316242c4a7  35 hours ago  714 MB
icr.io/appcafe/websphere-liberty  kernel-java21-openj9-ubi-minimal  d3066edad595  35 hours ago  406 MB
```

# サーバー機能の更新

## 冗長ガーベッジコレクションのデフォルトの有効化(v24.0.0.3)

IBM SDK for Java Technology Edition version 8.x（いわゆるIBM Java 8）を使用している環境，およびIBM Semeru Runtimesを使用している環境で，冗長ガーベッジコレクションの構成をしていない場合，デフォルトで冗長ガーベッジコレクションが記録されるようになりました。

冗長ガーベッジコレクションは，OutOfMemoryErrorをはじめとしたメモリ系の問題の解析にあたって必須の資料です。かならず有効にしておくようにガイドされていましたが，デフォルトで有効になりました。一つのログファイルに1024回分のGCの情報が記録され，ローテートしながら最新10世代のファイルが保存されます。

冗長ガーベッジコレクションの構成が明示的にされている場合には，その設定内容は変更されません。また，HotSpot VMなどを使用している場合は，別途構成を追加して有効にしてください。

## MicroProfile Metrics 3.0 および 4.0でのヒストグラムとタイマー メトリックの強化(v24.0.0.7)

MicroProfile Metrics 3.0 および 4.0（javax名前空間に対応したバージョン）で，取得できる情報が追加されました。この追加情報は，MicroProfile Metrics 5.1（jakarta名前空間に対応したバージョン）で取得できるようになったものがバックポートされたものです。

詳細については，[v24.0.0.7公開時のBlog](https://openliberty.io/ja/blog/2024/07/16/24.0.0.7.html)（[日本語](https://openliberty.io/ja/blog/2024/07/16/24.0.0.7.html)，[英語](https://openliberty.io/blog/2024/07/16/24.0.0.7.html)）を参照ください。

## Feature指定時のバージョンレス機能(v24.0.0.8)

Java EE仕様やJakarta EE仕様は，それぞれ多くの仕様の集合として定義されており，個々の仕様ごとに独立したバージョン番号がつけられています。原則としてLibertyでは，異なるJava EE/Jakarta EEバージョンに属する仕様を混在させることはできません。

| |Servlet|JSP|CDI|JAX-RS|
|:--|:--|:--|:--|:--|
|Java EE 7|`servlet-3.1`|`jsp-2.3`|`cdi-1.2`|`jaxrs-2.0`|
|Java EE 8|`servlet-4.0`|`jsp-2.3`|`cdi-2.0`|`jaxrs-2.1`|
|Jakarta EE 9.1|`servlet-5.0`|`pages-3.0`|`cdi-3.0`|`restfulWS-3.0`|
|Jakarta EE 10|`servlet-6.0`|`pages-3.1`|`cdi-4.0`|`restfulWS-3.1`|

例えばJava EE 8に属する`servlet-4.0`や`jsp-2.3`と組合わせることができるのは，同じJava EE 8に属する`cdi-2.0`や`jaxrs-2.1`であり，Jakarta EE 10に属する`cdi-4.0`やJava EE 7に属する`jaxrs-2.0`と組み合わせることはできません。

この正しいバージョンの組み合わせを見つけるために，詳細なドキュメントの調査が毎回必要となっていたのですが，この負担を軽減するため，v24.0.0.8からバージョンレス機能をつかった構成が可能になりました。`<platform>javaee-8.0</platform>`のような指定をすれば，個々の仕様ごとにバージョンを記入する必要がなくなります。

```xml:server.xml
<!-- Enable features -->
<featureManager>
    <platform>javaee-8.0</platform>
    <feature>servlet</feature>
    <feature>jsp</feature>
    <feature>cdi</feature>
    <feature>jaxrs</feature>
</featureManager>
```

また，MicroProfileについても，同様の記述が可能になります。

```xml:server.xml
<!-- Enable features -->
<featureManager>
    <platform>microProfile-5.0</platform>
    <feature>mpHealth</feature>
    <feature>mpMetrics</feature>
</featureManager>
```

バージョンレスFeatureについては，v24.0.0.9やv24.0.0.10でも，機能改善（バージョンを省略できるFeatureの追加）が行われています。

# セキュリティ機能の更新

## OpenID Connectでバックチャネル・ログアウトのサポート(v24.0.0.3)

Open LibertyのOpenID Connectクライアントとサーバーがバックチャネルログアウトに対応しました。バックチャネルログアウトは，OpenID ConnectサーバーがユーザーのログアウトをOpenID Connectクライアントに直接通知し，各OpenID Connectクライアントもローカルでユーザーをログアウトできるようにします。

詳細については，[v24.0.0.3公開時のBlog](https://openliberty.io/ja/blog/2024/03/26/24.0.0.3.html)（[日本語](https://openliberty.io/ja/blog/2024/03/26/24.0.0.3.html)，[英語](https://openliberty.io/blog/2024/03/26/24.0.0.3.html)）を参照ください。

## 不要なRESTハンドラーレコードの生成を避けるためのAudit 2.0(v24.0.0.8)

v24.0.0.8から`audit-2.0` Featureが追加されました。このFeatureは`audit-1.0`と同様の監査レコードを提供しますが，RESTハンドラ・アプリケーションのレコードは生成しません。RESTハンドラ・アプリケーションを使用していないユーザー向けに提供されています。

## サードパーティCookieをブロックする制限を緩和するCHIPSへの対応(v24.0.0.9)

Google Chromeなどのブラウザでは，段階的にサードパーティCookieを廃止する方針を打ち出しています。これを緩和する方法としてCHIPS（独立したパーティション状態を持つCookie）という手法が提案されています。

Libertyが利用するセッションIDやLTPA，JWTセキュリティのCookieについてCHIPS対応する手段がv24.0.0.9から提供されています。

詳細については，[v24.0.0.9公開時のBlog](https://openliberty.io/ja/blog/2024/09/10/24.0.0.9.html)（[日本語](https://openliberty.io/ja/blog/2024/09/10/24.0.0.9.html)，[英語](https://openliberty.io/blog/2024/09/10/24.0.0.9.html)）を参照ください。

## サードパーティCookieの送信を制御するSameSite属性を設定する手段の追加(v24.0.0.12)

サードパーティCookieの送信を制御するCookieヘッダーの属性として，[SameSite属性が追加](https://web.dev/articles/samesite-cookies-explained)されています。最近のGoogle Chromeの更新で，このSameSite属性がついていない場合のデフォルトの動作が変更され，いままで送信されていたサードパーティCookieが送信されなくなるケースが出てきました。

現在のServlet APIで提供されているCookieクラスでは，SameSite属性を扱うことができないので，アプリケーションでこの属性を追加することは容易ではありません。そのため，Libertyの構成として，CookieにSameSite属性を追加する手段が提供されました。またLiberty自身が送信するセッションIDやLTPA/JWTセキュリティのCookieにもSameSite属性を設定する構成ができるようになりました。

詳細については，[OpenLiberty.ioのBlog(英文)](https://openliberty.io/blog/2020/03/25/set-samesite-attribute-cookies-liberty.html)を参照してください。

## WASからのSSL接続でホスト名チェックがデフォルトで有効に(v24.0.0.9)

従来型のWebSphere Application ServerやLibertyは，外部へのSSL接続する際のサーバー証明書検証において，サーバー名の検証を行っていませんでした。これは脆弱性であるとの指摘を受け，CVE番号が割り当てられました。この対応のため，デフォルトでサーバー名を検証するように修正されました。

これによりLibertyがクライアントとなり別のサーバーにSSL/TLS接続を行っている環境で，SSL/TLS接続する際に指定したホスト名が，サーバー側が使用している証明書のCN（Common Name）やSAN（Subject Alternative Name）のいずれとも一致していないと，接続に失敗するようになります。

対処方法などについては，[この修正について解説したTechnical Flash](https://www.ibm.com/support/pages/node/7168472/)を参照ください。

Libertyでは，ゼロマイグレーション・ポリシーによって原則としてデフォルト値などは変更されません。ですが，脆弱性の修正などが目的の場合は例外となります。このような変更は，たとえば[WebSphere LibertyのFixpackのページではKnown Side Effects](https://www.ibm.com/support/pages/24009-websphere-application-server-liberty-24009#notice)として紹介されています。今回の件は，3年ぶり3つめのKnown Side Effectsの追加となります。



# その他の機能

## 配布パッケージに署名ファイル(pem)を添付(v24.0.0.1)

Open Libertyの配布パッケージに，配布アーカイブの信頼性と整合性を確認するための署名ファイル(pemファイル)が添付されるようになりました。[こちらのページの手順](https://openliberty.io/docs/latest/verifying-package-signatures.html)で，ダウンロードしたパッケージを確認することができます。

# ガイドの拡充

Open Libertyのサイトでは，各種シナリオにそった「実際に試せるガイド」を公開しています。このガイドにたいしても，今年は多くのコンテンツが追加されました。

- 2月の更新
    - [Testcontainersで本番に近い統合テストを構築する](https://openliberty.io/guides/testcontainers.html)
- 4月の更新
    - [リアクティブ Java マイクロサービスの作成](https://openliberty.io/guides/microprofile-reactive-messaging.html)
    - [MicroProfile Reactive Messaging を使用したメッセージの確認](https://openliberty.io/guides/microprofile-reactive-messaging-acknowledgment.html)
    - [RESTful サービスとリアクティブ システムの統合](https://openliberty.io/guides/microprofile-reactive-messaging-rest-integration.html)
    - [テンプレート インターフェースを使用して RESTful サービスを非同期的に利用する](https://openliberty.io/guides/microprofile-rest-client-async.html)
    - [Server-Sent Events を使用してクライアントに更新をストリーミングする](https://openliberty.io/guides/reactive-messaging-sse.html)
    - [リアクティブ JAX-RS クライアントを使用した RESTful サービスの利用](https://openliberty.io/guides/reactive-rest-client.html)
    - [リアクティブ Java マイクロサービスのテスト](https://openliberty.io/guides/reactive-service-testing.html)
    - [Kubernetes Operators を使用してマイクロサービスを OpenShift 4 にデプロイする](https://openliberty.io/guides/cloud-openshift-operator.html)
- 8月の更新
    - [CI/CDのための環境固有のマイクロサービス構成の外部化](https://openliberty.io/guides/microprofile-config-profile.html)
- 11月の更新
    - [Javaマイクロサービースにおけるメッセージの送受信](https://openliberty.io/guides/jms-intro.html)

また，7月には[cognitiveclass.aiサイト](https://cognitiveclass.ai/)で，[Open Libertyを使用したクラウドネイティブJavaアプリケーション開発の基本コース](https://cognitiveclass.ai/courses/essentials-for-java-application-development-with-liberty)が公開されています。

# まとめ：2025年に向けて

以上が，2024年に公開されたOpen Liberty/WebSphere Libertyでの新機能となります。

また2025年にも，米国時間1月28日公開予定のv25.0.0.1から12回のFixpack公開が予定されています。来年は延期されていたJakarta EE 11の公開，MicroProfile仕様のさらなる更新，次期LTSであるJava 25の公開など，大型の更新がいくつも予定されています。

これからも，Libertyは業界最速で新仕様への対応をすすめていくとともに，ゼロマイグレーション・ポリシーによって，既存のアプリケーションをより長くお使いいただけるランタイムとして，進化を続けていきます。