Open Libertyをz/OSで動かす


[Can I run Open Liberty on z/OS?](https://community.ibm.com/community/user/wasdevops/blogs/david-follis/2021/04/14/can-i-run-open-liberty-on-zos)
Well yes.

ということで試してみました。

# Download packageを動かす

## 導入

まず、[openliberty.io](https://openliberty.io/)から**Get Open Liberty**、**Download package**で好みのパッケージをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/c70f02bb-f48f-0cd7-4f73-a0caa6294114.png)

ダウンロードしたファイルを、z/OS USS(Unix System Services)のHFS(Hierarchical File System)上にアップロードします。

```ftp
ftp> cd /tmp/openliberty
250 HFS directory /tmp/openliberty is the current working directory
ftp> bin
200 Representation type is Image
ftp> put openliberty-22.0.0.10.zip
200 Port request OK.
125 Storing data set /tmp/openliberty/openliberty-22.0.0.10.zip
250 Transfer completed successfully.
ftp: 305498487 バイトが送信されました 1839.02秒 166.12KB/秒。
```

アップロードしたファイルをunzipで展開します。

```shell-session
> cd /tmp/openliberty
> unzip openliberty-22.0.0.10.zip
```

展開されたwlp/bin配下にあるスクリプトはASCIIファイルのためそのままではz/OS USS上で実行できません。ISO8859-1(ASCII)ファイルとしてタグ付けし、USSの自動コード・セット変換で実行できるようにします。

```shell-session
> chtag -Rtc ISO8859-1 wlp/bin
```

## 導入（Java 11）

ついでに、Java 11も導入しておきます。

[IBM Supportサイト](https://www.ibm.com/support/pages/java-sdk-products-zos#v11)からIBM Semeru Runtime Certified Edition for  z/OS, Version 11.0のnon-SMPE formatを入手し、HFS上にアップロードします。

```ftp
ftp> put ibm-semeru-certified-jdk_s390x_zos_11.0.16.0.pax.Z
200 Port request OK.
125 Storing data set /tmp/openliberty/ibm-semeru-certified-jdk_s390x_zos_11.0.16.0.pax.Z
250 Transfer completed successfully.
ftp: 412038144 バイトが送信されました 1873.86秒 219.89KB/秒。
```

アップロードしたファイルをPAXで展開します。

```shell-session
> pax -ppx -rvzf ibm-semeru-certified-jdk_s390x_zos_11.0.16.0.pax.Z
```

Open LibertyがJava 11を使えるように、`JAVA_HOME`環境変数に展開されたディレクトリーを指定します。

```shell-session
> export JAVA_HOME=/tmp/openliberty/J11.0_64
```

## 起動

`server start`コマンドで、Open Libertyサーバーを開始します。

```shell-session
> wlp/bin/server start

Starting server defaultServer.
Server defaultServer started with process ID 83951818.
```

ログを参照します。コンソールログはEBCDICで、メッセージログはISO8859-1(ASCII)で出力されます。

```shell-session
> cat wlp/usr/servers/defaultServer/logs/console.log
Server defaultServer created.
Launching defaultServer (Open Liberty 22.0.0.10/wlp-1.0.69.cl221020220912-1100) on IBM J9 VM, version 11.0.16+8 (en_US)
[AUDIT   ] CWWKE0001I: The server defaultServer has been launched.
[AUDIT   ] CWWKZ0058I: Monitoring dropins for applications.
[AUDIT   ] CWWKF0012I: The server installed the following features: [el-3.0, jsp-2.3, servlet-3.1].
[AUDIT   ] CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 9.363 seconds.
```

```shell-session
> iconv -f ISO8859-1 -t IBM-1047 wlp/usr/servers/defaultServer/logs/messages.log
********************************************************************************
product = Open Liberty 22.0.0.10 (wlp-1.0.69.cl221020220912-1100)
wlp.install.dir = /WSZ1/tmp/openliberty/wlp/
java.home = /WSZ1/tmp/openliberty/J11.0_64
java.version = 11.0.16
java.runtime = IBM Semeru Runtime Certified Edition for z/OS (11.0.16+8)
os = z/OS (02.03.00; s390x) (en_US)
process = 83951818@wsz1
Classpath = /WSZ1/tmp/openliberty/wlp/bin/tools/ws-server.jar:/WSZ1/tmp/openliberty/wlp/bin/tools/ws-javaagent.jar
Java Library path = /WSZ1/tmp/openliberty/J11.0_64/lib/default:/WSZ1/tmp/openliberty/J11.0_64/lib:/WSZ1/tmp/openliberty/J11.0_64/lib/default:/WSZ1/tmp/openliberty/J11.0_64/lib:/WSZ1/tmp/openliberty/J11.0_64/lib/jli:/WSZ1/tmp/openliberty/J11.0_64/lib/j9vm:/lib:/usr/lib:.
********************************************************************************
[10/19/22, 15:35:36:269 GMT+09:00] 00000001 com.ibm.ws.kernel.launch.internal.FrameworkManager           A CWWKE0001I: The server defaultServer has been launched.
[10/19/22, 15:35:41:115 GMT+09:00] 00000001 com.ibm.ws.kernel.launch.internal.FrameworkManager           I CWWKE0002I: The kernel started after 5.785 seconds
[10/19/22, 15:35:42:336 GMT+09:00] 00000031 com.ibm.ws.kernel.feature.internal.FeatureManager            I CWWKF0007I: Feature update started.
[10/19/22, 15:35:44:208 GMT+09:00] 00000025 com.ibm.ws.app.manager.internal.monitor.DropinMonitor        A CWWKZ0058I: Monitoring dropins for applications.
[10/19/22, 15:35:44:535 GMT+09:00] 00000031 com.ibm.ws.tcpchannel.internal.TCPPort                       I CWWKO0219I: TCP Channel defaultHttpEndpoint has been started and is now listening for requests on host localhost  (IPv4: 127.0.0.1) port 9080.
[10/19/22, 15:35:44:692 GMT+09:00] 00000031 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0012I: The server installed the following features: [el-3.0, jsp-2.3, servlet-3.1].
[10/19/22, 15:35:44:692 GMT+09:00] 00000031 com.ibm.ws.kernel.feature.internal.FeatureManager            I CWWKF0008I: Feature update completed in 3.583 seconds.
[10/19/22, 15:35:44:693 GMT+09:00] 00000031 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 9.363 seconds.
```

# starter applicationを動かす

## PC上での動作確認とパッケージ化

[openliberty.io](https://openliberty.io/)から**Get Open Liberty**、**Create a starter application**でスターターアプリケーションを生成してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/137ffd7e-1f14-3753-4c9b-8e2ae8c64572.png)

PC上でunzipし、`mvnw liberty:dev`で動かしてみます。

```winbatch
>mkdir app-name
>cd app-name
>unzip ..\app-name.zip
>mvnw liberty:dev
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.demo:app-name >--------------------------
[INFO] Building app-name 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- liberty-maven-plugin:3.6.1:dev (default-cli) @ app-name ---
（省略）
[INFO] [監査      ] CWWKF0011I: defaultServer サーバーは、Smarter Planet に対応する準備ができました。defaultServer サー バーは 57.868 秒で始動しました。
（省略）
[INFO] ************************************************************************
[INFO] *    Liberty is running in dev mode.
[INFO] *        Automatic generation of features: [ Off ]
[INFO] *        h - see the help menu for available actions, type 'h' and press Enter.
[INFO] *        q - stop the server and quit dev mode, press Ctrl-C or type 'q' and press Enter.
[INFO] *
[INFO] *    Liberty server port information:
[INFO] *        Liberty server HTTP port: [ 9080 ]
[INFO] *        Liberty server HTTPS port: [ 9443 ]
[INFO] *        Liberty debug port: [ 7777 ]
[INFO] ************************************************************************
[INFO] To run tests on demand, press Enter.
[INFO] Running unit tests...
[INFO] Source compilation was successful.
```

起動したので、`q[enter]`で停止します。

```winbatch
[INFO] CWWKM2001I: Invoke command は ["（省略）\app-name\target\liberty\wlp\bin\server.bat", stop, defaultServer] です。
[INFO] サーバー defaultServer を停止中です。
（省略）
[INFO] [監査      ] CWWKE0036I: 4 分, 12.43 秒後にサーバー defaultServer が停止しました。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  07:05 min
[INFO] Finished at: 2022-10-21T15:28:15+09:00
[INFO] ------------------------------------------------------------------------
```

`mvnw liberty:package`でパッケージを作成します。

```winbatch
>mvnw liberty:package
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.demo:app-name >--------------------------
[INFO] Building app-name 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- liberty-maven-plugin:3.6.1:package (default-cli) @ app-name ---
（省略）
[INFO] サーバー defaultServer をパッケージ中です。
[INFO] サーバー defaultServer のパッケージが （省略）\app-name\target\app-name.zip で完了しました。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:12 min
[INFO] Finished at: 2022-10-21T15:33:06+09:00
[INFO] ------------------------------------------------------------------------
```

## 導入

生成されたパッケージを、HFS上にアップロードします。

```ftp
ftp> cd /tmp/openliberty
250 HFS directory /tmp/openliberty is the current working directory
ftp> bin
200 Representation type is Image
ftp> put target/app-name.zip
200 Port request OK.
125 Storing data set /tmp/openliberty/app-name.zip
250 Transfer completed successfully.
ftp: 117999807 バイトが送信されました 229.12秒 515.02KB/秒。
```

アップロードしたファイルをunzipで展開し、wlp/bin配下にあるスクリプトをISO8859-1(ASCII)ファイルとしてタグ付けます。また、実行権限がついていないのでこれも付与します。

```shell-session
> cd /tmp/openliberty
> unzip app-name.zip
> chtag -Rtc ISO8859-1 wlp/bin
> chmod -R u+x wlp/bin
```

## 起動

`server start`コマンドで、Open Libertyサーバーを開始します。

```shell-session
> wlp/bin/server start

Starting server defaultServer.
Server defaultServer started with process ID 16843008.
```

```shell-session
> cat wlp/usr/servers/defaultServer/logs/console.log
Launching defaultServer (Open Liberty 22.0.0.10/wlp-1.0.69.cl221020220912-1100) on IBM J9 VM, version 11.0.16+8 (en_US)
[AUDIT   ] CWWKE0001I: The server defaultServer has been launched.
（省略）
[AUDIT   ] CWWKT0016I: Web application available (default_host): http://localhost:9080/app-name/
[AUDIT   ] CWWKZ0001I: Application app-name started in 9.332 seconds.
[AUDIT   ] CWWKF0012I: The server installed the following features: [appAuthentication-2.0, appAuthorization-2.0, appClientSupport-2.0, appSecurity-4.0, batch-2.0, beanValidation-3.0, cdi-3.0, concurrent-2.0, connectors-2.0, connectorsInboundSecurity-2.0, distributedMap-1.0, enterpriseBeans-4.0, enterpriseBeansHome-4.0, enterpriseBeansLite-4.0, enterpriseBeansPersistentTimer-4.0, enterpriseBeansRemote-4.0, expressionLanguage-4.0, faces-3.0, jakartaee-9.1, jdbc-4.2, jndi-1.0, json-1.0, jsonb-2.0, jsonp-2.0, jwt-1.0, mail-2.0, managedBeans-2.0, mdb-4.0, messaging-3.0, messagingClient-3.0, messagingSecurity-3.0, messagingServer-3.0, microProfile-5.0, monitor-1.0, mpConfig-3.0, mpFaultTolerance-4.0, mpHealth-4.0, mpJwt-2.0, mpMetrics-4.0, mpOpenAPI-3.0, mpOpenTracing-3.0, mpRestClient-3.0, pages-3.0, persistence-3.0, persistenceContainer-3.0, restConnector-2.0, restfulWS-3.0, restfulWSClient-3.0, servlet-5.0, ssl-1.0, transportSecurity-1.0, webProfile-9.1, websocket-2.0, xmlBinding-3.0, xmlWS-3.0].
[AUDIT   ] CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 27.281 seconds.
```

# まとめ

以上のように、z/OS上でOpen LibertyのDownload package、および、starter applicationを動かすことができました。

Open Libertyには、z/OS固有のフィーチャー、開始プロシージャーのテンプレート、プロシージャーから呼び出すネイティブのラウンチャー等が含まれていませんので、サポートがないことを度外視しても本番稼働には向いていませんが、分散環境で稼働しているアプリケーションがz/OS上でも稼働するか確認したいなどの目的であれば気軽に試せそうです。