クイックスタート WildFly

#はじめに

Advent Calendar 16日目です。
[2018年末のAdvent Calendar](https://qiita.com/advent-calendar/2018/nri-openstandia)にWildFly の記事を書いてから3年が経ちました。

https://qiita.com/tama1/items/829be5aacd81637ae73a

その時に使用したのが WildFly-14.0.1.Final で、2021年12月1日現在の最新バージョンは WildFly-25.0.1.Final なので、3年の間に11もバージョンが上がったことになります。

その間、どのような変化があったか、ざっと挙げてみると以下のようになっています。見出しレベルでしか書きませんので、詳細を知りたい方は公式サイトのリリースノートを見てください。

:information_source:長くなるので折りたたんでます。▲をクリックすると広がります。

<details><summary>WildFly更新履歴概要</summary><div>
<b>WildFly-15：</b>[リリースノート](https://www.wildfly.org/news/2018/12/13/WildFly15-Final-Released/)
・JDK11のサポート
・サーバーの可観測性
・HTTPSリスナーのSNIサポート
・JASPICとElytronの統合<br/>
<b>WildFly-16：</b>[リリースノート](https://www.wildfly.org/news/2019/02/27/WildFly16-Final-Released/)
Galleonを使用したWildFlyのプロビジョニング
・メッセージングの改善
・クラスタリングの改善<br/>
<b>WildFly-17：</b>[リリースノート](https://www.wildfly.org/news/2019/06/10/WildFly17-Final-Released/)
・クラスタリングの改善
・メッセージングの改善<br/>
<b>WildFly-18：</b>[リリースノート](https://www.wildfly.org/news/2019/10/03/WildFly18-Final-Released/)
Jakarta EE8/Java EE8 の互換実装として認定されました。
・MicroProfile 3 対応
・セキュリティの強化
・EEサブシステムの機能強化
・クラスタリングの機能強化
・管理機能の強化
・Jakartaコミュニティとの連携強化<br/>
<b>WildFly-19：</b>[リリースノート](https://www.wildfly.org/news/2020/03/18/WildFly19-Final-Released/)
・MicroProfile 3.3 対応<br/>
<b>WildFly-20：</b>[リリースノート](https://www.wildfly.org/news/2020/06/08/WildFly20-Final-Released/)
・セキュリティ機能強化
・EJB機能強化
・MicroProfileの統合<br/>
<b>WildFly-21：</b>[リリースノート](https://www.wildfly.org/news/2020/10/13/WildFly21-Final-Released/)
・BootableJAR/galleonレイヤー
・セキュリティ機能強化
・EJB機能強化
・管理機能強化<br/>
<b>WildFly-22：</b>[リリースノート](https://www.wildfly.org/news/2021/01/13/WildFly22-Final-Released/)
・ロギングにlog4j2のサポートを追加
・WildFlyのプロビジョニングと管理の機能追加
・メッセージング機能強化
・セキュリティ機能強化
・galleon機能パックの変更<br/>
<b>WildFly-23：</b>[リリースノート](https://www.wildfly.org/news/2021/03/11/WildFly23-Final-Released/)
・MicroProfile 4.0 対応
・WildFlyのプロビジョニングと管理の機能追加
・メッセージング機能強化
・galleon機能パックの変更<br/>
<b>WildFly-24：</b>[リリースノート](https://www.wildfly.org/news/2021/06/17/WildFly24-Final-Released/)
・いくつかの新機能を追加
・Codehaus Jackson の削除<br/>
<b>WildFly-25：</b>[リリースノート](https://www.wildfly.org/news/2021/10/05/WildFly25-Final-Released/)
・いくつかの新機能を追加
・セキュリティレイヤーの変更<br/>
</div></details>

一番大きな変化としては [Eclipse MicroProfile の実装](https://www.wildfly.org/news/2021/03/11/WildFly23-Final-Released/)と galleon に対応したことでしょうか

それぞれ簡単に説明すると Eclipse MicroProfile は、Jakarta EE(Java EE) の機能を一部取り入れたマイクロサービスアーキテクチャ向けの仕様です。galleon は、WildFly をカスタマイズしてインストールすることが出来るツールです。

逆に言えばそれ以外は大きくは変わっていないので、3年前の記事がまだ（ほぼ）使えたりします。

###:warning:Log4Shell(CVE-2021-44228/CVE-2021-4104)
12月になって log4j の脆弱性のホットな話題が出てきましたので WildFly についても触れておきます。

<b>CVE-2021-44228</b>
log4j 2.x に関する脆弱性です。WildFly の公式ツイッターでコメントが出ているように WildFly には問題となった log4j-core が含まれていないので影響ありませんが、ユーザーが作成したアプリケーションに含まれていた場合は影響を受ける可能性がありますのでご注意ください。

https://twitter.com/WildFlyAS/status/1469362190536818688

<b>CVE-2021-4104</b>
後から追加された log4j 1.x の類似の脆弱性になります。こちらもアプリケーションに log4j が含まれていて、かつ JMSAppender が使用されていた場合、影響を受ける可能性がありますのでご注意ください。

:information_source:さらに詳細な情報が出ていました。  
[WildFly Impact of the Apache Log4j Security Vulnerabilities](https://www.wildfly.org/news/2021/12/13/Log4j-CVEs/)

# 今回やること
WildFly は Jakarta EE/Java EE の互換実装として多くの機能を持っています。しかし、その機能を利用するためには、ユーザー自身がアプリケーションを作成する必要があります。

ドキュメントを読んだけどよく分からない、とりあえず何か動かしたい。そんな時のためのサンプルとして`QuickStart`というものが [WildFly の github](https://github.com/wildfly/quickstart) に用意されています。今回はその`QuickStart`を紹介してみようと思います。

`QuickStart` は、WildFly の公式サイトの[ダウンロードメニュー](https://www.wildfly.org/downloads/)からもそれぞれのバージョンに対応したものがリンクされています。

今回使用した環境は以下です。

* Windows 10
* Java 8 (Oracle JDK 1.8.0)
* WildFly-25.0.1.Final
* Apache Maven-3.8.4
* quickstart-25.0.1.Final

## 事前準備

[3年前の記事](https://qiita.com/tama1/items/829be5aacd81637ae73a)と一部内容が被っていますが、時間も経っていますので改めて書いておきます。長いので折りたたんでますが、説明しなくても分かるという方は読み飛ばして下さい。

<details><summary>コマンドプロンプトを使う</summary>
<div>Windows 10 の場合は下記にあります。
`スタートボタン`→`Windows　システムツール`→`コマンドプロンプト`

コマンドプロンプトを起動すると黒い画面が現れてコマンドを入力できます。いくつでも開けます。

```:コマンドプロンプト

Microsoft Windows [Version 10.0.19043.1348]
(c) Microsoft Corporation. All rights reserved.

C:\Users\tamaru>
```
</div></details>

<details><summary>Java 8 以上が使えるか確認する</summary>
<div>まず Java 8 以上がインストールされている必要があります。コマンドプロンプトを開いて下記のコマンドを実行して確認して下さい。

```:コマンドプロンプト
java -version
```

下記のように言われたら Java がインストールされていないので [Oracle 社のサイト](https://www.oracle.com/technetwork/jp/java/javase/downloads/index.html)から java SE(JDK)をダウンロードしてインストールして下さい。

```:コマンドプロンプト
'java' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

`java -version` と打ってバージョン情報が表示されればOKです。

```:コマンドプロンプト
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
```

</div></details>

<details><summary>WildFly を入手する</summary>
<div>WildFly の[公式サイト](http://wildfly.org/)から[ダウンロード](http://wildfly.org/downloads/)して下さい。今回は`wildFly-25.0.1.Final.zip`をダウンロードしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/cefc0965-b580-a28b-339b-3e76bdfe4fd9.png">
</div></details>

<details><summary>WildFly のインストール</summary>
<div>
`wildfly-25.0.1.Final.zip`を任意のフォルダに展開し、コマンドプロンプトで展開先の`bin`フォルダに移動してください。今回は`C:\wildfly-25.0.1.Final`に置きました。

```:コマンドプロンプト
cd C:\wildfly-25.0.1.Final\bin
```

`bin`フォルダにある`standaloe.bat`が起動コマンドなので実行します。

```:コマンドプロンプト
standalone.bat
```

WildFly 起動開始します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/cb49d97c-2e37-da03-3d08-aa9e957fc3da.png">

ずらずらっと文字列が表示され、`WildFly Full 25.0.1.Final (WildFly Core 17.0.3.Final) started in xxxxms`という文字が出れば起動完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/8fb054b8-eb4a-7775-d337-a82a764ad6f5.png">

WildFlyは、8080番ポートで動きます。下記にアクセスするとトップ画面が表示されます。
http://localhost:8080/
<img src="https://qiita-image-store.s3.amazonaws.com/0/227018/812eac63-9ca2-1de8-df51-c9abae6417b5.jpeg" width="50%">
</div></details>

<details><summary>Apache Maven を入手する</summary>
<div>Apache Maven の[公式サイト](https://maven.apache.org/)から[ダウンロード](https://maven.apache.org/download.cgi)して下さい。今回は`apache-maven-3.8.4-bin.zip`をダウンロードしました。
</div></details>

<details><summary>Apache Maven のインストール</summary>
<div>
`apache-maven-3.8.4-bin.zip` を任意のフォルダに展開してください。今回は`C:\apache-maven-3.8.4`に置きます。
</div></details>

# Quickstart を入手する。

https://github.com/wildfly/quickstart にアクセスし、使用する WildFly に対応したバージョンを選択してください。今回は、2021年12月現在で最新の[quickstar-25.0.1.Final](https://github.com/wildfly/quickstart/tree/25.0.1.Final)を使用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/7e195643-c3de-b17d-981c-f6a2908d23dd.png">

選択したら git コマンドや github の Download ZIP ボタンでソースツリーを取得してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/c799188c-fe6a-c027-eacb-602846e25257.png">

# Quickstart の確認
ダウンロードしてきた`Quickstart`を展開すると以下のようになり、各サンプルがフォルダ毎に分かれています。今回は `C:\quickstart-25.0.1.Final`に置きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/16956ab8-9ddb-3268-7c9f-23acc4278ffa.png">

最初に読む `README.adoc` は `asciidoc` で書かれているので、ブラウザの拡張機能などをインストールして参照してください。念のため Chrome の拡張機能 `Asciidoctor.js Live Preview`の追加手順を書いておきます。:information_source:オマケ情報なので折りたたんでおきます。

<details><summary>:paperclip:Chrome に拡張機能 Asciidoctor.js Live Preview を追加する</summary>
<div>

Firefox の `Asciidoctor.js Live Preview` アドオンも使用してみましたが、なぜか Include しているファイルが読み込まれませんでしたので、Chrome 版を使います。

Chrome の右側のボタンより、拡張機能画面を開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/f9cf140a-98eb-5169-7e2c-47169549f230.png">
Chrome ウェブストアを開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/adbf8e9e-9ce3-5d94-cbdb-97ac49b1a1ff.png">
Chromw ウェブストアで検索して`Asciidoctor.js Live Preview`を見つけてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/0346622c-98ab-8a9b-87b6-5e1769cfecf4.png">
`Asciidoctor.js Live Preview`が見つかったら`Chrome に追加ボタンを押して追加して下さい。`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/0aebea9c-f37c-dfbf-a0ff-49242fd1d43f.png">
拡張機能の追加確認ダイアログ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/7e175d23-07c2-96b9-6700-05d5054aa2b8.png">
`Asciidoctor.js Live Preview`の追加が完了したら、拡張機能管理画面で設定をいじります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/6ea11200-9e04-64df-a6f9-b5b50d4ee31c.png">
`Asciidoctor.js Live Preview`の詳細ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/18540b73-4665-48c4-f539-c14092902c57.png">
`ファイルのURLへのアクセスを許可する`設定を有効化します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/cb6733af-3001-2c35-8d74-7bde2857d6da.png">
以上で完了です:v:
</div></details>

## README の確認

`C:\quickstart-25.0.1.Final\README.adoc` の`9. Table of Available Quickstarts`の表には、各サンプルの`Quickstart Name(名前)`、`Demonstrated Technologies(デモする機能)`、`Description(概要説明)`、`Experience Level Required(必要なレベル)`、`Prerequisites(前提条件)`が一覧で記載されています。

今回は、どんなプログラムでも最初に試すであろう`helloworld`を実行してみようと思います。`Experience Level Required` は、当然`Beginner`:beginner:です。

手順は `C:\quickstart-25.0.1.Final\helloworld\README.adoc`に書かれています。開くとこんな感じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/d995115b-b617-96fd-ad48-f06343007b0c.png" width="80%">

以降は`README.adoc`に書いてある通りに進めていきます。

## What is it?
`helloworld`は`CDI`と`Servlet 3`の機能を使用したサンプルアプリで、少ないコード量で作成されています。

WildFly 25.x の[機能一覧](https://docs.wildfly.org/25/Getting_Started_Guide.html)で言えば`Jakarta Contexts and Dependency Injection`と`Jakarta Servlet`のサンプルになります。

Javaソースは、`HelloWorldServlet.java`と`HelloService.java`しかないのでざっと見てみましょう

https://github.com/wildfly/quickstart/blob/25.0.1.Final/helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java

43行目で Servlet 3 より導入された [@WebServlet](https://jakarta.ee/specifications/platform/8/apidocs/javax/servlet/annotation/webservlet) アノテーションを使用することで、サーブレットとして`/HelloWorld`のパスから呼び出せるようになります。

```java
@WebServlet("/HelloWorld")
```
55行目の [@Inject](https://jakarta.ee/specifications/dependency-injection/1.0/apidocs/) アノテーションがCDIの機能を使用している部分で、CDIにより、クラス間の依存関係を自動的に注入してくれます。このサンプルでは、変数`helloService`に`HelloService.class`が注入(インジェクト)されます。

```java
    @Inject
    HelloService helloService;
```
:information_source: なお`webapp/WEB-INF/beans.xml`はインジェクトするクラスを探すための設定が書かれているので必要です。


## System Requirements
前提として、Java 8.0 (Java SDK 1.8)以上とApache Maven 3.3.1 以上をインストールされている必要があります。

## Use of the WILDFLY_HOME and QUICKSTART_HOME Variables
環境変数`WILDFLY_HOME`と`QUICKSTART_HOME`を設定します。
併せて環境変数`JAVA_HOME`の追加、Apache Maven の環境変数`PATH`への追加も行います。

<details><summary>環境変数の設定</summary>
<div>
スタートボタンの`設定`を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/0e3c33f9-0650-085e-e903-2abbf92eeae7.png" width="50%">

設定画面の`システム`をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/2d97606c-12a0-2a2b-d6eb-eb256ec39e93.png" width="70%">

`詳細設定`をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/2078240f-b74b-af6a-bd9b-c560f95deb19.png">

`環境変数`ボタンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/cd5f67bb-5645-321d-047e-982c7f5fb821.png" width="50%">

環境変数一覧画面が表示されます。ユーザー環境変数とシステム環境変数がありますが、今回はユーザー環境変数の方に設定して行きます。

`新規ボタン`をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/638fbcdf-7ada-d1d1-3e88-5a3dc3408ac1.png" width="50%">

<b>WILDFLY_HOME の追加</b>
変数名(N): に`WILDFLY_HOME`、変数値(V):に`C:\wildfly-25.0.1.Final`を入力し`OK`ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/67cb1906-a628-259d-f84d-1d953d80c815.png" width="50%">

<b>QUICKSTART_HOME の追加</b>
同様に、変数名(N): に`QUICKSTART_HOME` 変数値(V):に`C:\quickstart-25.0.1.Final`を入力し`OK`ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/9c64c30b-23ce-4f01-4165-85128f2719b4.png" width="50%">

<b>JAVA_HOME の追加</b>
環境変数`JAVA_HOME`にインストールした`JDKのパス`を設定します。
変数名(N): に `JAVA_HOME` 変数値(V):に `JDKのパス` を入力し`OK`ボタンを押します。
:information_source: `jdk-8u291-windows-x64.exe`の場合は`C:\Program Files\Java\jdk1.8.0_291`にインストールされました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/0f710db1-550c-6ed9-4ef6-6c74601d6afd.png" width="50%">

<b>Apache Maven の bin を PATH に追加</b>
環境変数`Path`を編集します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/17204d12-be8b-80d5-1843-48c996ef6caf.png" width="50%">

`新規`ボタンを押し、`c:\apache-maven-3.8.4\bin` を追加し`OK`ボタンを押します。そのまま続けて`OK`を押して、`環境変数`ウィンドウ、`システムのプロパティ`ウィンドウを閉じて設定完了です。

:information_source: 既に開いているコマンドプロンプトには反映されませんので、閉じて開きなおしてください。

</div>
</details>

#ビルドして実行する。

準備が済んだところで、いよいよ実行してみましょう。引き続き `README.adoc`に従って進めて行きます。運がよければあっけなく終わってしまうと思います。

## Start the WildFly Standalone Server
まず、WildFly を起動しておきます。

`C:\wildfly-25.0.1.Final\bin` に移動

```:コマンドプロンプト
cd C:\wildfly-25.0.1.Final\bin
```
`standalone.bat` の実行

```:コマンドプロンプト
standalone.bat
```
WildFly 起動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/cb49d97c-2e37-da03-3d08-aa9e957fc3da.png">

## Build and Deploy the Quickstart

ビルドとデプロイを行います。起動したらそのままにして、もう一つコマンドプロンプトを開き quickstart の `helloworld`まで移動します。

```:コマンドプロンプト
cd C:\quickstart-25.0.1.Final\helloworld
```
続いて、以下にように打ち込みます。

```:コマンドプロンプト
mvn clean package wildfly:deploy
```
後は一気に進みます。いろいろな物がダウンロードされます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/c308a904-ae54-c5d0-e218-1077f565ec81.png">

<font color="#00FF00">BUILD SUCCESS</font>と出れば完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227018/47188037-eae6-5ea5-4a37-b4755eebd74e.png">

成功した場合は`WildFly`を起動していたコマンドプロンプト側に以下のような文字列が出ていると思います。

```コマンドプロンプト
[org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "helloworld.war" (runtime-name : "helloworld.war")
```
## Access the Application

確認です。http://localhost:8080/helloworld/ にアクセスしてみましょう。
「Hello World!」と出たら成功です。おつかれさまでした。 

# 終わりに

確認が済んだらアプリケーションをアンデプロイしておきましょう

## Undeploy the Quickstart

`helloworld`をアンデプロイします。ビルド時に使ったコマンドプロンプトで以下のように打ち込んでください。

```コマンドプロンプト
mvn wildfly:undeploy
```

`WildFly`を起動していたコマンドプロンプト側に以下のように出たらアンデプロイの成功です。

```コマンドプロンプト
[org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0009: Undeployed "helloworld.war" (runtime-name: "helloworld.war")
```

:information_source: もう使わないのであれば、[設定した環境変数](https://qiita.com/tama1/private/4b038a331e67390b94d1#use-of-the-wildfly_home-and-quickstart_home-variables)も消しておいた方が良いです。特に`WILDFLY_HOME`は、違うパスにWildFlyをインストールした場合におかしな動作になりますのでご注意下さい。

<b>Run the Quickstart in Red Hat CodeReady Studio or Eclipse</b> 以降までは紹介しきれないので省略させて頂きます:bow:

今回は`helloworld`のみの紹介になりましたが、他のサンプルもだいたい同じような流れで実行することになりますので、興味のある方は試してみてください。