Open LibertyのGet started（Create a starter application）をcurlで呼び出す

# What's？

Open Libertyでアプリケーションを作る時のとっかかりとして、以下のページを使うと思います。

https://openliberty.io/start/

こちらですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/5a235eaf-6683-7e85-9508-6e661892fd9c.png)

これ、`curl`で呼び出せたりしないのかな？と思って見てみたらふつうにできそうだったので、メモしておきます。

# 試してみる

まずは、デフォルトの状態でアプリケーションを作成してみると、実際に投げられているHTTPリクエストは以下になります。

```
https://start.openliberty.io/api/start?a=app-name&b=maven&e=10.0&g=com.demo&j=11&m=6.0
```

QueryStringで、各種パラメータを指定しています。

意味はそれぞれ以下のようです。

- `a` … Arfifact
- `b` … Build Tool（`maven`または`gradle`を指定）
- `j` … Java SE Version
- `e` … Java EE/Jakarta EE Version
- `m` … MicroProfile Version

パラメーターが足りなかったりすると`400`になります。

```shell
$ curl -i 'https://start.openliberty.io/api/start'

...

HTTP/2 400

...
```

Web UIの方でJava EE/Jakarta EE VersionやMicroProfile Versionを変更すると、自動的に対応するバージョンを変更してくれるのですが、HTTPで直接呼び出すとそのあたりは考慮してくれなさそうです。  
※`200`になります

というわけで、`-o`でファイル名を指定して出力するのがよかろうとは思いますが。

```shell
$ curl -o sample.zip 'https://start.openliberty.io/api/start?a=sample&b=maven&e=10.0&g=com.demo&j=17&m=6.0'
```

パラメーター数が多いので、こんな感じがよいでしょうか。

```shell
$ curl -G https://start.openliberty.io/api/start \
  -o sample.zip \
  -d a=sample \
  -d b=maven \
  -d e=10.0 \
  -d g=com.demo \
  -d j=17 \
  -d m=6.0
```

汎用化すると、こうですね。

```shell
$ curl -G https://start.openliberty.io/api/start \
  -o [zipファイル名] \
  -d a=[アーティファクト名] \
  -d b=[ビルドツール] \
  -d e=[Java EE/Jakarta EE Version] \
  -d g=[グループID] \
  -d j=[Java SE Version] \
  -d m=[MicroProfile Version]
```

zipファイルの中身はこんな感じなので

```shell
$ unzip -l sample.zip
Archive:  sample.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2023-08-08 04:04   src/main/java/com/demo/
     1930  2023-08-08 04:04   src/main/liberty/config/server.xml
      199  2023-08-08 04:04   Dockerfile
       65  2023-08-08 04:04   .dockerignore
      180  2023-08-08 04:04   src/main/java/com/demo/rest/RestApplication.java
     2367  2023-08-08 04:04   README.txt
    59925  2023-08-08 04:04   .mvn/wrapper/maven-wrapper.jar
      233  2023-08-08 04:04   .mvn/wrapper/maven-wrapper.properties
     9781  2023-08-08 04:04   mvnw
     6889  2023-08-08 04:04   mvnw.cmd
     1985  2023-08-08 04:04   pom.xml
      267  2023-08-08 04:04   .gitignore
---------                     -------
    83821                     12 files
```

展開時には`-d`を指定するのがよいでしょうか。

```shell
$ unzip sample.zip -d sample
```

展開後、ディレクトリ内に移動して

```shell
$ cd sample
```

実行、ですね。

```shell
$ mvn liberty:dev

または

$ ./mvnw liberty:dev
```

今回作成された`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>sample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

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

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

    <build>
        <finalName>sample</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.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>io.openliberty.tools</groupId>
                <artifactId>liberty-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
```

`server.xml`。

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

    <!-- Enable features -->
    <featureManager>
        <feature>jakartaee-10.0</feature>
        <feature>microProfile-6.0</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="/sample" location="sample.war" />

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

# starterのソースコード

今回の呼び出し先のstarterのソースコードは、こちらのGitHubリポジトリーにあるようです。

https://github.com/OpenLiberty/start.openliberty.io

パラメーターも合ってそうです。

https://github.com/OpenLiberty/start.openliberty.io/blob/main/src/main/java/io/openliberty/website/starter/StartResource.java

適用されるOpen Libertyのバージョンを指定できたりしないのかな？と思ったりもしたのですが、これは固定のようでした。

https://github.com/OpenLiberty/start.openliberty.io/blob/main/src/main/resources/templates/maven/pom.xml