Open Libertyを試してみる

# What's？

Java EE／Jakarta EEのアプリケーションサーバーである、Open Libertyをちょっと試してみたいということで。

Open LibertyのGetting startedの流れをなぞりつつ、簡単なJAX-RSとCDIを使ったアプリケーションを動かすところまでやってみようと思います。

そもそもOpen Libertyとは？というところも見ていきたいなと。

# WebSphere

まずは、WebSphereから。

以下のページを見ると、「WebSphere Traditionalランタイム」と「WebSphere Libertyランタイム」の2種類があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/6a54e354-e1d0-7ae3-f19f-e3a2a0dc45bc.png)

https://www.ibm.com/jp-ja/cloud/websphere-application-server

WAS ND（WebSphere Application Server Network Deployment）のページはこちら。

https://www.ibm.com/docs/ja/was-nd?topic=SSAW57/mapfiles/product_welcome_wasnd.html

WAS Baseへのリンクは、同じページに戻ってきます。

https://www.ibm.com/jp-ja/cloud/websphere-application-server

WebSphere Libertyのページはこちら。

https://www.ibm.com/jp-ja/cloud/websphere-liberty

つまり、現在のWebSphereには「Traditional」と「Liberty」の2つのランタイムがあるようです。

Traditionalは現バージョンが最後となる予定のような記事を見かけるのですが、WebSphereのドキュメント上ではわかりませんでした。

WebSphereの製品展開は、以下のドキュメントあたりも参考になりそうです。

https://www.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/3/760/JAJPJP19-0203/index.html&request_locale=ja

# Open LibertyとWebSphere Liberty

続いて、Open Libertyについて。

OSSで開発されているOpen Libertyの商用バージョンが、WebSphere Libertyのようです。

> Open Liberty は、モジュラー機能を使用して構築された、軽量のオープン・ソース Java™ ランタイムです。 WebSphere Liberty は、Open Liberty の商用バージョンです。

> Open Libertyと従来のWebSphereの互換機能を組み合わせたWebSphere Libertyは、既存アプリケーションのモダナイズの理想的な選択肢です。

[Open Liberty と WebSphere Liberty](https://cloud.ibm.com/docs/java?topic=java-liberty&locale=ja)

Open Libertyのサイトはこちら。

https://openliberty.io/

WebSphere Libertyのドキュメントからの、"WebSphere Liberty"の各エディションごとの機能比較。

https://www.ibm.com/docs/ja/was-liberty/base?topic=management-liberty-features

以下のエディションがあるようです。

- WebSphere Application Server Liberty Core
- WebSphere Application Server
- WebSphere Application Server Network Deployment (分散オペレーティング・システムおよび IBM i)
- WebSphere Application Server for z/OS
- Open Liberty

Open Libertyと商用版であるWebSphereでは、管理系の機能などに差がありそうです。

最初、「WebSphere Application Server」がTraditionalのことを言っているのかな？とも思ったのですが、そうではなさそうです。あくまでこのページは、「Libertyランタイム」が対象ですね。

このあたりのエディション間の関係は、こちらがわかりやすかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/72aafbe2-5458-b900-e20b-ef0612f925cc.png)

[Open Liberty: オープンソースになったWebSphere Liberty p.13](https://www.slideshare.net/takakiyo/open-liberty-websphere-liberty/13)

Traditionalランタイム（図中ではFullプロファイル）とLibertyランタイム（図中ではLibertyプロファイル）の話はこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/25bc9f69-8a0c-3d49-70f0-24ad541cfb7f.png)

[Open Liberty: オープンソースになったWebSphere Liberty p.16](https://www.slideshare.net/takakiyo/open-liberty-websphere-liberty/16)

なんとなく、製品やエディションの事情が掴めたところで、実際に扱っていってみます。

# 環境

今回の環境は、こちらです。

```shell
$ java --version
openjdk 11.0.16 2022-07-19
OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /home/charon/.sdkman/candidates/maven/current
Java version: 11.0.16, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-126-generic", arch: "amd64", family: "unix"
```

# starterを使ったアプリケーションの作成

Open Libertyを使ったアプリケーションは、こちらのページをとっかかりにして作成したいと思います。

https://openliberty.io/start/

今回は、Java 11、Jakarta EE 8、MicroProfile 4.1で作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/6b340044-da8a-6b17-1fb7-8b4b849a66a6.png)

プロジェクトを作成すると、zipとしてダウンロードできるので解凍。

```shell
$ unzip openliberty-jaxrs-example.zip
```

中身はこのようになっています。

```shell
Archive:  openliberty-jaxrs-example.zip
   creating: src/main/java/com/demo/
  inflating: src/main/liberty/config/server.xml
  inflating: Dockerfile
  inflating: .dockerignore
  inflating: src/main/java/com/demo/rest/RestApplication.java
  inflating: README.txt
  inflating: .mvn/wrapper/maven-wrapper.jar
  inflating: .mvn/wrapper/maven-wrapper.properties
  inflating: mvnw
  inflating: mvnw.cmd
  inflating: pom.xml
  inflating: .gitignore
```

ファイルを見てみましょう。

`pom.xml`

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>openliberty-jaxrs-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>8.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.microprofile</groupId>
            <artifactId>microprofile</artifactId>
            <version>4.1</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>openliberty-jaxrs-example</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.3.2</version>
                </plugin>
                <plugin>
                    <groupId>io.openliberty.tools</groupId>
                    <artifactId>liberty-maven-plugin</artifactId>
                    <version>3.6.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>io.openliberty.tools</groupId>
                <artifactId>liberty-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
```

ソースコードは、JAX-RSのエントリーポイントがあるだけです。

```java:src/main/java/com/demo/rest/RestApplication.java
package com.demo.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApplication extends Application {

}
```

Open Libertyの構成ファイル。

```xml:src/main/liberty/config/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>jakartaee-8.0</feature>
        <feature>microProfile-4.1</feature>
    </featureManager>

    <!-- This template enables security. To get the full use of all the capabilities, a keystore and user registry are required. -->

    <!-- For the keystore, default keys are generated and stored in a keystore. To provide the keystore password, generate an
        encoded password using bin/securityUtility encode and add it below in the password attribute of the keyStore element.
        Then uncomment the keyStore element. -->
    <!--
    <keyStore password=""/>
    -->

    <!--For a user registry configuration, configure your user registry. For example, configure a basic user registry using the
        basicRegistry element. Specify your own user name below in the name attribute of the user element. For the password,
        generate an encoded password using bin/securityUtility encode and add it in the password attribute of the user element.
        Then uncomment the user element. -->
    <basicRegistry id="basic" realm="BasicRealm">
        <!--
        <user name="yourUserName" password="" />
        -->
    </basicRegistry>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint id="defaultHttpEndpoint"
                  httpPort="9080"
                  httpsPort="9443" />

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <!-- Configures the application on a specified context root -->
    <webApplication contextRoot="/openliberty-jaxrs-example" location="openliberty-jaxrs-example.war" />

    <!-- Default SSL configuration enables trust for default certificates from the Java runtime -->
    <ssl id="defaultSSLConfig" trustDefaultCerts="true" />
</server>
```
`Dockerfile`

```shell:Dockerfile
FROM icr.io/appcafe/open-liberty:kernel-slim-java11-openj9-ubi

COPY --chown=1001:0 /src/main/liberty/config /config

RUN features.sh

COPY --chown=1001:0 target/*.war /config/apps

RUN configure.sh
```

最後に`README.md`。


```markdown:README.txt
After you generate a starter project, these instructions will help you with what to do next.

The Open Liberty starter gives you a simple, quick way to get the necessary files to start building
an application on Open Liberty. There is no need to search how to find out what to add to your
Maven build files. A simple RestApplication.java file is generated for you to start
creating a REST based application. A server.xml configuration file is provided with the necessary
features for the MicroProfile and Jakarta EE versions that you previously selected.

If you plan on developing and/or deploying your app in a containerized environment, the included
Dockerfile will make it easier to create your application image on top of the Open Liberty Docker
image.

1) Once you download the starter project, unpackage the .zip file on your machine.
2) Open a command line session, navigate to the installation directory, and run `mvnw liberty:dev`.
   This will install all required dependencies and start the default server. When complete, you will
   see the necessary features installed and the message "server is ready to run a smarter planet."

For information on developing your application in dev mode using Maven, see the
dev mode documentation (https://openliberty.io/docs/latest/development-mode.html).

For further help on getting started actually developing your application, see some of our
MicroProfile guides (https://openliberty.io/guides/?search=microprofile&key=tag) and Jakarta EE
guides (https://openliberty.io/guides/?search=jakarta%20ee&key=tag).

If you have problems building the starter project, make sure the Java SE version on your
machine matches the Java SE version you picked from the Open Liberty starter on the downloads
page (https://openliberty.io/downloads/). You can test this with the command `java -version`.

Open Liberty performs at its best when running using Open J9 which can be obtained via IBM Semeru
(https://developer.ibm.com/languages/java/semeru-runtimes/downloads/). For a full list of supported
Java SE versions and where to obtain them, reference the Java SE support page
(https://openliberty.io/docs/latest/java-se.html).

If you find any issues with the starter project or have recommendations to improve it, open an
issue in the starter GitHub repo (https://github.com/OpenLiberty/start.openliberty.io).
```

# ソースコードの作成

ソースコードは、こんな感じで作成。

```java:src/main/java/com/demo/rest/HelloResource.java
package com.demo.rest;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@ApplicationScoped
@Path("hello")
public class HelloResource {
    @Inject
    private HelloService helloService;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return helloService.message();
    }
}
```

```java:src/main/java/com/demo/rest/HelloService.java
package com.demo.rest;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class HelloService {
    public String message() {
        return "Hello Open Liberty JAX-RS Application";
    }
}
```

JAX-RS、CDIを使ったアプリケーションです。

# Liberty Mavenプラグインを使ってOpen Libertyを起動する

では、Getting startedに沿ってアプリケーションを起動してきます。

https://openliberty.io/guides/getting-started.html

`liberty:run`で、Open Libertyがフォアグラウンドで起動します。

```shell
$ mvn liberty:run
```

[Getting started with Open Liberty / Building and running the application](https://openliberty.io/guides/getting-started.html#building-and-running-the-application)

初回のダウンロードは、けっこうな時間がかかります…。

このあたりが表示されれば、起動できています。

```shell
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/jwt/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/ibm/api/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/health/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openapi/ui/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/metrics/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openapi/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openliberty-jaxrs-example/
[INFO] [監査      ] CWWKZ0001I: アプリケーション openliberty-jaxrs-example が 8.057 秒で開始しました。
[INFO] [監査      ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[appClientSupport-1.0, appSecurity-2.0, appSecurity-3.0, batch-1.0, beanValidation-2.0, cdi-2.0, concurrent-1.0, distributedMap-1.0, ejb-3.2, ejbHome-3.2, ejbLite-3.2, ejbPersistentTimer-3.2, ejbRemote-3.2, el-3.0, j2eeManagement-1.1, jacc-1.5, jakartaee-8.0, jaspic-1.1, javaMail-1.6, jaxb-2.2, jaxrs-2.1, jaxrsClient-2.1, jaxws-2.2, jca-1.7, jcaInboundSecurity-1.0, jdbc-4.2, jms-2.0, jndi-1.0, jpa-2.2, jpaContainer-2.2, jsf-2.3, json-1.0, jsonb-1.0, jsonp-1.1, jsp-2.3, jwt-1.0, managedBeans-1.0, mdb-3.2, microProfile-4.1, monitor-1.0, mpConfig-2.0, mpFaultTolerance-3.0, mpHealth-3.1, mpJwt-1.2, mpMetrics-3.0, mpOpenAPI-2.0, mpOpenTracing-2.0, mpRestClient-2.0, opentracing-2.0, servlet-4.0, ssl-1.0, wasJmsClient-2.0, wasJmsSecurity-1.0, wasJmsServer-1.0, webProfile-8.0, websocket-1.1]。
[INFO] [監査      ] CWWKF0011I: defaultServer サーバーは、Smarter Planet に対応する準備ができました。defaultServer サーバーは 18.156 秒で始動しました。
```

こちらが今回作成したアプリケーションです。

```shell
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openliberty-jaxrs-example/
[INFO] [監査      ] CWWKZ0001I: アプリケーション openliberty-jaxrs-example が 8.057 秒で開始しました。
```

確認。

```shell
$ curl -i localhost:9080/openliberty-jaxrs-example/api/hello
HTTP/1.1 200 OK
X-Powered-By: Servlet/4.0
Content-Type: text/plain
Date: Thu, 29 Sep 2022 07:40:32 GMT
Content-Language: ja-JP
Content-Length: 37

Hello Open Liberty JAX-RS Application
```

フォアグラウンドで起動しているサーバーは、Ctrl-cでストップします。

コンテキストパスは`openliberty-jaxrs-example`となっていましたが、これは`src/main/liberty/config/server.xml`ファイルに以下のように定義されているからでしょうね。

```xml:src/main/liberty/config/server.xml
    <!-- Configures the application on a specified context root -->
    <webApplication contextRoot="/openliberty-jaxrs-example" location="openliberty-jaxrs-example.war"/>
```

バックグラウンドで起動するには、`liberty:start`を使います。

```shell
$ mvn liberty:start
```

停止は、`liberty:stop`で。

```shell
$ mvn liberty:stop
```

# 実行可能JARにパッケージングする

実行可能JARへのパッケージングもできるようです。

まっさらな状態からだと、以下のコマンドでOpen Libertyにアプリケーションをデプロイ済みの状態で実行可能JARを作成します。

```shell
$ mvn package liberty:create liberty:install-feature liberty:deploy liberty:package -Dinclude=runnable
```

[Getting started with Open Liberty / Running the application from a minimal runnable JAR](https://openliberty.io/guides/getting-started.html#running-the-application-from-a-minimal-runnable-jar)

実行可能JARは、以下のように`java -jar`で実行可能です。

```shell
$ java -jar target/openliberty-jaxrs-example.jar
```

アクセスするURLや`curl`での確認結果は、先ほどと同様なので割愛します。

実行可能JARは実行するたびに配下に内容が展開されて増えていくようなので、この点はちょっと注意が必要な気がします。

```shell
$HOME/wlpExtract
```

ところで、まっさらなプロジェクトの状態から以下のコマンドでJARファイルを作成、アプリケーションを起動しても

```shell
$ mvn liberty:package -Dinclude=runnable
$ java -jar target/openliberty-jaxrs-example.jar
```

以下のようなエラーになります。

```shell
[エラー     ] CWWKF0001E: jakartaee-8.0 のフィーチャー定義が見つかりませんでした。
[エラー     ] CWWKF0001E: microprofile-4.1 のフィーチャー定義が見つかりませんでした。
```

`liberty:deploy`を入れなかった場合はこうなります。

```shell
[警告      ] CWWKZ0014W: アプリケーション openliberty-jaxrs-example は、ロケーション openliberty-jaxrs-example.war に見つからなかったので開始できませんでした。
```

各手順の合間で、以下のように`mvn clean`をしていたのですが、こうするとGetting startedの流れとずれてしまうので良くなかったようです。

```shell
$ mvn clean
```

# 組み込むフィーチャーを絞る

先ほど作成した実行可能JARのサイズは、100MBを超えています。

```shell
$ ll -h target/openliberty-jaxrs-example.jar
-rw-rw---- 1 charon charon 121M  9月 29 19:04 target/openliberty-jaxrs-example.jar
```

ちょっと大きいですね。

ここで、`src/main/liberty/config/server.xml`に目を向けます。

以下のようにまるっとしたフィーチャーが指定されています。

```xml:src/main/liberty/config/server.xml
    <!-- Enable features -->
    <!--The Liberty Maven Plugin has generated Liberty features necessary for your application in configDropins/overrides/generated-features.xml-->
    <featureManager>
        <feature>jakartaee-8.0</feature>        <feature>microProfile-4.1</feature>
    </featureManager>
```

WebSphere Libertyで指定できるフィーチャーはこちら。

https://www.ibm.com/docs/ja/was-liberty/base?topic=management-liberty-features

フィーチャーに関するドキュメント。

https://openliberty.io/docs/22.0.0.10/reference/feature/feature-overview.html

組み込むフィーチャーを指定することで、サーバーに組み込む機能を制御することができます。

多くのフィーチャーがあるのですが、これを個々に指定するのではなく、ある程度まとまった単位で簡単に指定できるコンビニエンスフィーチャーというものもあります。

[Feature overview / Convenience features](https://openliberty.io/docs/22.0.0.10/reference/feature/feature-overview.html#conv)

現時点でのコンビニエンスフィーチャーは以下です。

- https://openliberty.io/docs/22.0.0.10/reference/feature/jakartaee-9.1.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/webProfile-9.1.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/jakartaeeClient-9.1.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/javaee-8.0.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/webProfile-8.0.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/javaeeClient-8.0.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/microProfile-5.0.html
- https://openliberty.io/docs/22.0.0.10/reference/feature/enterpriseBeans-4.0.html

ここまでは、このバージョン違いである以下のフィーチャーを指定していました。

https://openliberty.io/docs/22.0.0.10/reference/feature/jakartaee-8.0.html

https://openliberty.io/docs/22.0.0.10/reference/feature/microProfile-4.1.html

今回は、JAX-RSとCDIに絞り込んでみます。

```xml:src/main/liberty/config/server.xml
    <!-- Enable features -->
    <!--The Liberty Maven Plugin has generated Liberty features necessary for your application in configDropins/overrides/generated-features.xml-->
    <featureManager>
        <!--
        <feature>jakartaee-8.0</feature>
        <feature>microProfile-4.1</feature>
        -->
        <feature>jaxrs-2.1</feature>
        <feature>cdi-2.0</feature>
    </featureManager>
```

ビルド。

```shell
$ mvn package liberty:create liberty:install-feature liberty:deploy liberty:package -Dinclude=runnable
```

40MBを切るほどに小さくなりました。

```shell
$ ll -h target/openliberty-jaxrs-example.jar
-rw-rw---- 1 charon charon 38M  9月 29 19:05 target/openliberty-jaxrs-example.jar
```

起動時にデプロイされるアプリケーションは、以下のみになりました。

```shell
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openliberty-jaxrs-example/
```

Jakarta EE 8やMicroProfile 4のフィーチャーを使っていた時からは、以下のものが表示されなくなっています。

```shell
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/jwt/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/ibm/api/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/health/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openapi/ui/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/metrics/
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openapi/
```

動作確認結果は、最初と変わらないので割愛。

# Liberty Mavenプラグインの開発モードを使う

最後に、Liberty Mavenプラグインの開発モードを使ってみましょう。

このモードは、実行前にLiberty Mavenプロファイルの`generate-features`、`create`、`install-feature`、`deploy`ゴールを実行するようです。

>  This goal also invokes the generate-features, create, install-feature, and deploy goals before starting the runtime.

https://github.com/OpenLiberty/ci.maven/blob/liberty-maven-3.6.1/docs/dev.md

使い方は、`liberty:dev`ゴールを指定するだけです。

```shell
$ mvn liberty:dev
```

これでOpen Libertyが立ち上がり、開発モードであることが表示されます。

```shell
[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 debug port: [ 7777 ]
[INFO] ************************************************************************
```

この時にソースコードを変更すると、変更を検出してビルド・デプロイが行われるので便利です。

たとえば以下のソースコードで

```java
@ApplicationScoped
public class HelloService {
    public String message() {
        return "Hello Open Liberty JAX-RS Application";
    }
}
```

実行結果がこのような場合に

```shell
$ curl localhost:9080/openliberty-jaxrs-example/api/hello
Hello Open Liberty JAX-RS Application
```

ソースコードを変更すると

```java
@ApplicationScoped
public class HelloService {
    public String message() {
        return "Hello Open Liberty JAX-RS Application!!";
    }
}
```

変更が検出され、ビルド、再デプロイが行われます。

```shell
[INFO] Source compilation was successful.
[INFO] [監査      ] CWWKT0017I: Web アプリケーションが削除されました (default_host): http://localhost:9080/openliberty-jaxrs-example/
[INFO] [監査      ] CWWKZ0009I: アプリケーション openliberty-jaxrs-example は正常に停止しました。
[INFO] [監査      ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/openliberty-jaxrs-example/
[INFO] [監査      ] CWWKZ0003I: アプリケーション openliberty-jaxrs-example が 0.240 秒で更新されました。
```

再起動せずに反映されるので、便利ですね。

```shell
$ curl localhost:9080/openliberty-jaxrs-example/api/hello
Hello Open Liberty JAX-RS Application!!
```

# まとめ

Open Libertyを使ってみました。

起動も軽く、Mavenのプラグインを使った開発がやりやすそうだったり、実行可能JARとして作成できるのは良いなと思いました。

今後も利用していきたいですね。