Libertyで Spring Boot 3 を動かす

# 目的

Libertyで Spring Boot 3 のプログラムをテストします。


# Spring Boot 3 プログラムのベースを入手

いつものDockerに用意するのではなく、Spring Boot 3 プログラムのベースを作成するところから説明します。
Spring InitializerでMavenを指定してプロジェクトをダウンロードします。

[Spring Initializer](https://start.spring.io/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/b3f8ea6c-06ad-f2cc-904a-83620e57006f.png)

画像のように指定して　GENERATE ボタンを押してダウンロードします。
PackagingはWarにします。


# Eclipseにプロジェクトをインポート

ダウンロードした zip を Eclipseにインポートします。

zip は unzip しておきます。インポートするとそこがプロジェクトのディレクトリになるので、それを考慮します。

File > Import で Existing Maven Projects を選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/ea242d3b-ddbe-26f8-51ec-f46231a06912.png)

unzipしたディレクトリを選択するとインポートできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/0ec7eeaf-440a-fcbd-d8c2-d589facc28f4.png)


他に必要な構成 (方法はここでは省略）

- Libertyサーバーの追加とプロジェクトのビルドパスへの追加

注：Libertyは最新を使うようにします。導入済みのものでテストしてたら、最新で修正される関係ないエラーが発生してしまいました。mavenのプラグインからでも起動はできるように構成はできますが、ここでは別の構成としました。


# Hello World!!コードを追加してビルド

Eclipseを使ってソースを追加します。

```HelloController.java
package pdprof.spring;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

	@RequestMapping(value = "/hello")
	@ResponseBody
	private String hello() {
		return "Hello World!!";
	}
}
```

書き方の詳細は気になったキーワードで検索、ということでここでは省略します。
その後はプロジェクトの右クリックメニューから Run As > Maven install でwarファイルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/65a99ebd-5364-1c09-8ee0-13bf884ad6d1.png)

注: war は Mavenプロジェクトのtargetディレクトリに作成されます。


# Libertyサーバーの構成と起動

Eclipseで先ほど作成したLibertyサーバーの server.xml に feature を追加します。また、springBootApplicationの location を maven install したときに作成される war ファイルを指定します。

```server.xml
<server description="new server">

    <!-- Enable features -->
    <featureManager>
    	<feature>servlet-6.0</feature>
        <feature>springboot-3.0</feature>
        <feature>localConnector-1.0</feature>
    </featureManager>

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

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>
    
    <springBootApplication location="/home/keniooi/git/spring-boot/workspace/pdprof/target/pdprof-0.0.1-SNAPSHOT.war">
		<applicationArgument>--server.servlet.context-path=/spring-boot</applicationArgument>
    </springBootApplication>

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

構成を保管したらサーバーを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/aa6a3892-3a5a-c323-ad68-092f3beacbe9.png)


http://localhost:9080/spring-boot/hello にアクセスして動作を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/68beb473-27b2-87f6-d9bf-8d8b1dcef1c1.png)


# Gitレポジトリ
ここまではプログラムの作成方法でしたが、Dockerを使った実行環境を構築して、動作を確認します。用意したGitレポジトリをクローンします。

```
git clone https://github.com/keniooi/spring-boot.git
cd spring-boot/spring-boot-docker/
```

レポジトリの構成
- workspace - eclipse workspace
- spring-boot-docker - Docker環境構築用ファイル

workspaceのほうはそのまま使用するか、別のworkspaceにインポートするなどして使用します。


# Libertyのイメージをビルドして開始

Spring Bootコードとサーバー構成を含むイメージをビルドします。

```
./setup-docker.sh
./start.sh
```


# コンテナーの動作確認

http://localhost:9080/spring-boot/hello にアクセスして動作を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/68beb473-27b2-87f6-d9bf-8d8b1dcef1c1.png)


# トラブルシューティング

毎度のことですが、よくつかう dockerコマンドを書いておきます。この文書でもpodman, dockerとまとまりがないですが、Linux では dockerがpodmanを呼び出すようになっていました。

```
docker ps # 動作中のContainer確認
docker logs -f spring-boot # ログ確認
docker restart spring-boot # 再起動
docker inspect spring-boot # container 確認
docker exec -it spring-booti bash # Container内状況確認
```

など試してみましょう。

# まとめ

Eclipseを使ってLibertyで動作するSpring BootのHello World!!を作成しました。
Spring BootのアプリケーションをDockerコンテナーで起動して動作をテストしました。