Open Liberty / WebSphere Liberty最新情報：2022年1月〜5月

OSSのエンタープライズJavaアプリケーションサーバー[Open Liberty](https://openliberty.io/)ならびに，その製品版の[WebSphere Liberty](https://www.ibm.com/jp-ja/cloud/websphere-liberty)の，バージョン22.0.0.1から22.0.0.5までの新機能についてご紹介します。

# API

## MicroProfile 5.0対応

2021年12月に公開されたMicroProfile 5.0に，1月に出た22.0.0.1で対応しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60041/a7f03da9-811e-4435-ab17-bb1b9a2856f7.png)

今回のUpdateは全てがオレンジ色で，原則全てのパッケージがアップデートされています。Jakarta EE 9．0の名前空間の変更（javax→jakarta）に対応しているためです。詳細な変更点については，[Eclipse Foundationのプレゼンテーション](https://docs.google.com/presentation/d/1PfXEOJzy8v2kGRudvknPox5elRasewv3MBeV0P4Rk6M/edit?usp=sharing)を参照ください。

## CommonJ WorkManagerのサポート

Libertyランタイムでは，従来のWebSphere traditionalランタイムで提供されていたAPIのうち，古い非推奨となったAPIや独自APIなど，いくつかサポートしていないAPIがあります。そのようなAPIを使用しているアプリケーションは，Libertyへ移行する際に大きな書き換えが必要となっています。

その一つがCommonJでした。これはJava EEアプリケーションで非同期処理を実装するために提供されていたIBM独自のAPIです。Java EE標準で同等の機能がConcurrency Utilities for Java EEとして提供されたため，非推奨となりました。

CommonJはLibertyランタイムには実装されいなかったのですが，[Heritage プログラミング・モデル](https://www.ibm.com/docs/ja/was-liberty/base?topic=liberty-enabling-heritage-programming-models)として提供されるようになりました。[heritageAPIs-1.1](https://www.ibm.com/docs/ja/was-liberty/base?topic=features-websphere-application-server-heritage-apis)およびconcurrent-1.0フィーチャーを有効にすれば，従来のCommonJを使用したアプリケーションが，そのままLibertyランタイムの上で稼働するようになります。

もちろん，これから新規に作成するアプリケーションでは，CommonJではなく，Concurrency Utilities for Java EEを使用するようにしてください。

# Core Runtime

## server.envの変数対応

Libertyランタイムのプロセスから参照可能な環境変数を設定するのがserver.envファイルです。通常はserver.xmlと同じディレクトリに置かれます。

このファイルの中では，変数の展開はおこなわれません。そのため，

```properties
hostname=a.b.com
url=http://${hostname}:9080
```

というような設定をおこなっても，urlは`http://${hostname}:9080`になってしまいます。22．0．0．1から，`# enable_variable_expansion`というコメント行を追加することにより，変数の展開がおこなわれるようになりました。

```properties
# enable_variable_expansion
hostname=a.b.com
url=http://${hostname}:9080
```

と構成することによりurlは`http://a.b.com:9080`という値に設定されるようになります。ただし，この挙動は**プラットフォーム依存**です。Windows環境では正常に動作しません。Windows環境で変数を展開したい場合は，以下のように感嘆符で変数名をくくる必要があります。

```properties
# enable_variable_expansion
hostname=a.b.com
url=http://!hostname!:9080
```

## JVMのワーキングディレクトリ

LibertyのJVMプロセスは，`WLP_OUTPUT_DIR`環境変数（デフォルトでは`${wlp.install.dir}/usr/servers`）で指定されたディレクトリの下のサーバー名のディレクトリをカレントディレクトリにして実行されています。

このカレントワーキングディレクトリを環境変数`SERVER_WORKING_DIR`で変更できるようになりました。相対パスで指定した場合にはデフォルトからの相対パス，絶対パスを指定した場合には，そのディレクトリが使用されます。

## Java 18サポート

4月に出た22.0.0.4から，Java SE 18環境での実行がサポートされるようになりました。

# Security

## 配布パッケージの署名

Open LibertyならびにWebSphere Libertyの配布パッケージに，署名ファイル（sigファイル）が添付されるようになりました。[IBMから提供されている公開鍵](https://public.dhe.ibm.com/ibmdl/export/pub/software/openliberty/sign/public_keys/WebSphereLiberty_06-02-2021.pem)を使用して，以下のように配布ファイルを検証することができます。

```shell
% openssl dgst -sha256 -verify public_key.pem \
    -signature wlp-base-all-22.0.0.6.jar.sig \
    wlp-base-all-22.0.0.6.jar
Verified OK
```

## Log4Shell脆弱性への対応

Libertyの持つクラスローダーに，脆弱性を持つ既知のクラスのロードをブロックする機能が追加されました。現在は`org.apache.logging.log4j.core.lookup.JndiLookup`という名前のクラスのロードが拒否されるようになっています。これにより，Liberty上で稼働するLog4jを使ったアプリケーションが，[Log4Shell脆弱性](https://ja.wikipedia.org/wiki/Log4Shell)（CVE-2021-44228）から保護されます。

## JWE for OpenID Connectのサポート

認証情報などを送受信するときに使用されるJWT（JSON Web Token）フォーマットで，内容を暗号化して送受信する仕組みがJWE（Web Encryption）です。OpenID Connect Client 1.0フィーチャーやSocial Media Login 1.0フィーチャーで，暗号化されたJWEの使用ができるようになりました。詳細については，[Open Liberty Blogのアップデート](https://www.openliberty.io/blog/2022/01/18/microprofile5-22001.html#jwe)を参照してください。

# Developer Experience

## JAX-RPCアプリケーションの変換ツール

SOAP通信によるシステム間連携を実装するためのJavaのAPIとしては，最初に出たJAX-RPC仕様と，後から出た改良された仕様であるJAX-WSの二種類があります。現在はJAX-RPCは非推奨となり，JAX-WSの利用が推奨されています。LibertyでもJAX-WSは利用できますが，JAX-RPCの利用はサポートされていません。そのため，JAX-RCPを使用したアプリケーションをLibertyで実行するためには，アプリケーションを大きく書き変える必要があり，Libertyランタイムへ移行する際の障壁の一つとなっていました。

このJAX-RPCからJAX−WSへの変換を自動でおこなう[WebSphere Liberty JAX-RPC Conversion Tool for Maven and Gradle](https://www.ibm.com/support/pages/node/6538940)が提供されています。使用方法については，[こちらから参照](https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-migrating-jax-rpc-applications)してください。

## Paketo Buildpackの提供

Dockerfileなどを記述しなくてもアプリケーションを実行するコンテナイメージを作成できるBuildpackを提供するOSSプロジェクト，[Paketo](https://paketo.io/)。Libertyを利用してアプリケーションを実行できるBuildpackが提供されていいます。[こちら](https://github.com/paketo-buildpacks/liberty)から利用できます。

利用方法については，[Open Liberty Blogの記事](https://www.openliberty.io/blog/2022/04/01/cloud-native-liberty-buildpack.html)を参照してください。