tomcatからwildflyに乗り換えて数年経過

# はじめに

tomcatからwildflyにのりかえて数年経過しました。
バージョンアップを試みました。

バージョンアップ前： Wildfly29  (2023/08/26)
バージョンアップ後： Wildfly35  (2025/02/06)
Javaのバージョン  17

数年たって、忘れかけているので、自分用にメモを残します。

Widlflyで動くWebアプリを作成する場合は、
これ以外にMavenがインストールされている必要があります。
（インストール手順は省略します）
私は主にMacで開発していますが、Windowsでも参考にはなると思います。

# 開発時に参考になる電子BOOK

Jakarta EE チュートリアル。著者はあつしさんです。

https://zenn.dev/atsushi_ni/books/fc0704403f28db

この電子BOOKでは、画面は  JSFで書かれています。
JSFに抵抗がない方は、この入門書が良いと思います
JSFは多少難しいです。（私はJSFを、ほとんど使っていません)

# downloadするもの

wildflyのダウンロードサイトから

https://www.wildfly.org/downloads/

wildfly 35.0.1の DistributionとQuick Startをダウンロードします


![Wildfly_down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339875/a21f3c41-c537-4a87-a49d-0e53d437f08d.png)

Quick Start には、サンプルアプリケーションが多数含まれています。

# Distribution を展開する

Wildflyはzipファイルを展開するだけで、ほぼ利用可能になります。
多少のカスタマイズ（設定変更）は必要ですが。

Widflyには１つのサーバで動かす standaloneモードと、複数のサーバで動かす domainモードがあります。
私はdomainモードを使った事はありません。
いつもstandaloneモードを利用しています。

カスタマイズの際に、よく使うディレクトリやファイルを以下に示します。

## warの配備場所
standalone\deployments
ここに開発して出来た warファイルを配備します。

## bin
bin/standalone.sh   (Mac or Linux)
bin/standalone.bat  (windows)

サーバーを起動する際のコマンドです。

## 設定ファイル
standalone/configuration/standalone.xml  
設定ファイルです。


# standalone.xmlのちょっとした説明

Standalone.xmlの中を 127.0.0.1で検索すると、３箇所ほど見つかると思います。

```
    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
    </interfaces>
```


ここを 127.0.0.1を  0.0.0.0に書き換えると、どこからでもアクセスできるようになります。
zipファイルを展開した直後のWildflyでは、127.0.0.1しかアクセスできないので、
自分のPC内の、ブラウザーからしかアクセスできません。
本番サーバーのように、他のPCからブラウザーでアクセスしたい場合は、0.0.0.0に書き換えた方が良いでしょう

最後の方に以下のような記述があります。
```
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
        <socket-binding name="http" port="${jboss.http.port:8080}"/>
        <socket-binding name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
```

Tomcatと同様に8080ポートを使いますので、http://127.0.0.1:8080/
となります。

http://127.0.0.1:9990/ は管理者画面にアクセスする際に使います。



# Quick Start

Quick Start Source Code（サンプル）のコンパイル方法。
Helloworldのディレクトリで、mvn packageを実行します。
Targetのディレクトリに helloworld.warが出来ます。
これを上記の standalone\deploymentsに入れてstandalone.shでサーバーを起動すれば、Helloworldが動きます。


# サーバ設定のより詳しい情報

Dexall公式テックブログという所に、詳しい説明がありました。

どのWildflyのバージョンについて書かれているのかは、不明です。

https://dexall.co.jp/articles/?p=865

https://dexall.co.jp/articles/?p=836

https://dexall.co.jp/articles/?p=1048

私は、これらのページに書かれている事の２０％程度ぐらいしか理解していません。

私の作っているアプリはチューニングが必要な程のアクセス数はないので、Dexall公式テックブログに書いてあるような事はしていませんが、安定して動いています。


# 管理者画面で使うユーザIDについて

http://127.0.0.1:9990/ は管理者画面と書きましたが、管理者画面にログインするために、IDとパスワードを追加する必要があります。

こちらは少々手順が長いので、別記事にしています。

https://qiita.com/masagl07s/items/e45091ef3d781d499ee9

# アプリ開発で使うpom.xmlについて

上に紹介しました、あつしさんの記事では、Chapter 05 「アプリの雛形をダウンロード」に手順が書かれています。

https://zenn.dev/atsushi_ni/books/fc0704403f28db

Chapter 03に「Wildflyの他、Payara, GlassFishを使っても良い」と書かれています。

つまり「アプリの雛形をダウンロード」から始めると、どのJakartaEEサーバーでも動くアプリが作れるという事です。

一方、私は Payara, GlassFish を全く使った事がなく、Wildflyで満足しているので、のりかえる気もありません。
そのため、上で紹介した、Wildfly の Quick Startのhelloworldから始めたいと思いました。

しかしpom.xmlの修正は、なかなかに難しかったので、以下にメモを残しておきます。
（以下長文になる事を、ご了承ください）

:::note warn
警告
これ以降に書いている事は
wildfly-35.0.1.Final-quickstartsについて書いている事に注意してください。
それ以外のバージョンの場合、行番号や書き方が変わっている場合があります
:::

８４行目から８６行目あたりに着目します

```
    <build>
        <!-- Set the name of the WAR, used as the context root when the app is deployed. -->
        <finalName>${project.artifactId}</finalName>

```

このbuildの中にあるfileNameタグに指定された名前で、warファイルが作成されます。
これはこのファイルの先頭の方に定義されています。

```
    <artifactId>helloworld</artifactId>
    <version>35.0.1.Final</version>
    <packaging>war</packaging>
    <name>Quickstart: helloworld</name>
    <description>Helloworld</description>

```

31行目のartifactIDはwarファイルの名前になるので、ご自分のアプリのwarファイルの名前にしてください。
次の２行は変更する必要はありません。
その次のname および、descriptionタグはご自分のアプリのプロジェクト名と、説明文に変更してください。


### 依存関係の追加
６８行目から８２行目のdependenciesの中には、自分が使いたいライブラリを追加してください。

私の場合ですと mybatis, mariadbのjdbcドライバ, slf4j, googleのgsonを追加しました。


書き忘れましたが、Quick Startのhelloworldの　親ディレクトリにあるpom.xmlも必要です。

この状態で、一旦完成です。

こ自分の作りたいアプリのソースコード(JavaやJSPなど)を追加して
mvn package を実行するとwarファイルができると思います。

ここで、問題点が２つありました。

１つめは CheckStyleのエラーが出てwarファイルが作れない事です。
私はあまり厳密なCheckStyle が好きでないので、外してしまいました。

方法は５２行目の後ろあたりに以下を入れる事です。

```
        <checkstyle.skip>true</checkstyle.skip>

```

もう１つの問題は、build時になぜか gitへのアクセスがある点です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339875/1eadee9e-e064-4083-b539-bf5c66423842.png)

私は、社内サーバーでソースを管理しているので、社外のgitにアクセスして欲しくありません。

これを禁止する方法は ChatGPTに聞いても、わかりませんでした。
試行錯誤してたどりついた解決方法を、以下に示します。

原因は１３１から１４９行目にある pluginsの指定にありました。
このプラグインを指定してしまうと、CheckStyleのタスクと、buildnumber-maven-pluginによるgitサーバーへのアクセスが動作する様子です。

これ以降の作業では、上記のpluginを無効にして、通常のに戻す、親ディレクトリにあるpom.xmlへの参照をやめる、変更に伴うエラーを修正していきます。

## 1 親ディレクトリの pom.xml参照をやめます

21行目から30行目にあるparentタグを削除します。

これをすると、 mvn packageをした際にgroupIdがないとエラーになります。
そのため　artifactIdの上あたりにgroupIDのタグを追加します。
タグの中に入れるのはご自分のアプリのグループIDです。

## 2   propertiesの中に以下の指定をします。

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

```

## 3  pluginの変更

fileNameの下にある pluginManagementのタグを開始から終了まで全部削除してください。

その代わりとして以下を入れます。

```
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
      </plugin>
    </plugins>

```
この変更により、CheckStyleのタスクと、buildnumber-maven-pluginによるgitサーバーへのアクセス動作がなくなります。

最後に、この状態で mvn packageをすると、エラーが出ると思います。

元々のhelloworldのpom.xmlの行番号で、９８行目から２１１行目のprofilesのあたりです。
このあたりは、私は使う予定がないので、全部消してしまいました。

これで、mvn packageを実行すると、エラーが発生せず、warファイルが作成できるようになります。

以上です。

長文を読んで頂きまして、ありがとうございました。