CLOVER🍀

That was when it all began.

WildFly Maven PluginでBootable JARを作成する

これは、なにをしたくて書いたもの?

WildFly 32.0.0.Finalがリリースされました。

WildFly 32 is released!

ちょっと気になるものとしてWildFly Glowというものがあるのですが。

その前に、WildFly Maven PluginでBootable JARが作れるようになったようなのでそちらを確認してみます。

WildFly Maven PluginでBootable JARを作成する

WildFly Maven PluginでBootable JARが作れるようになったことが書かれているブログエントリーはこちら。

What's new in WildFly provisioning

これまではBootable JARは、WildFly Jar Maven Pluginを使って作るものでした。

GitHub - wildfly-extras/wildfly-jar-maven-plugin: WildFly Bootable JAR

WildFly Maven Pluginのwildfly:packageゴールのページを見ると、bootableJarbootable-jarでも可)というパラメーターが
追加されています。

WildFly Maven Plugin – wildfly:package

こちらをtrueに設定すると、wildfly:package時にBootable JARを作成してくれます。

他のゴールでは無効な設定です。

また、作成されるBootable JARのデフォルトのファイル名はプロジェクトのアーティファクト名に関係なくserver-bootable.jarで、
変更する場合はbootableJarNamebootable-jar-nameでも可)で設定する必要があります。

wildfly:start-jarというゴールも追加されています。

WildFly Maven Plugin – wildfly:start-jar

これは、Bootable JARを起動するだけのコマンドです。

パッケージングしてBootable JARの作成まで行ってくれるわけではありません。

Bootable JARを作成せずに実行しても

$ mvn wildfly:start-jar

JARファイルがないと怒られます。

[ERROR] Failed to execute goal org.wildfly.plugins:wildfly-maven-plugin:5.0.0.Final:start-jar (default-cli) on project wildfly-maven-plugin-bootable-jar-example: Bootable JAR file '/path/to/target/server-bootable.jar' doesn't exist. -> [Help 1]

通常はjava -jarコマンドで起動することが多いと思うので、参考までに。

ちなみに、wildfly:start-jarゴールはこちらのページには載っていますが

WildFly Maven Plugin – Plugin Documentation

なぜかこちらのページには載っていません…。

WildFly Maven Plugin – WildFly Maven Plugin (wildfly-maven-plugin)

では、簡単に試してみましょう。

環境

今回の環境はこちら。

$ java --version
openjdk 21.0.2 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.2+13-Ubuntu-122.04.1, mixed mode, sharing)


$ mvn --version
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 21.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-21-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-105-generic", arch: "amd64", family: "unix"

アプリケーションを作成する

それでは、簡単なサンプルアプリケーションを作成します。Jakarta RESTful Web Services(JAX-RS)を使うだけのものにしましょう。

Maven依存関係など。

    <properties>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-web-api</artifactId>
            <version>10.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>5.0.0.Final</version>

                <!-- 後で -->
            </plugin>
        </plugins>
    </build>
</project>

packagingwarです。

JAX-RSの有効化。

src/main/java/org/littlewings/wildfly/RestApplication.java

package org.littlewings.wildfly;

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

@ApplicationPath("")
public class RestApplication extends Application {
}

リソースクラス。

src/main/java/org/littlewings/wildfly/HelloResource.java

package org.littlewings.wildfly;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("hello")
public class HelloResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String message() {
        return "Hello World!!";
    }
}

これで準備は完了です。

WildFly Maven PluginでBootable JARを作成する

では、WildFly Maven PluginでBootable JARを作成します。

まずは以下で設定。

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>5.0.0.Final</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- wildfly:dev も使うなら、finalNameで指定した方がよさそう -->
                    <!-- <runtime-name>ROOT.war</runtime-name> -->
                    <bootable-jar>true</bootable-jar>
                        <feature-pack>
                            <location>wildfly@maven(org.jboss.universe:community-universe)#32.0.0.Final</location>
                        </feature-pack>
                    </feature-packs>
                </configuration>
            </plugin>

packageゴール実行時にwildfly:packageゴールが動作するように設定。

                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>

いきなり脱線しますが、Bootable JAR作成時(というかプロビジョニング時)のデプロイ名をruntime-nameで変えられるのですが

                    <!-- wildfly:dev も使うなら、finalNameで指定した方がよさそう -->
                    <!-- <runtime-name>ROOT.war</runtime-name> -->

コメントで書いているように、この設定はwildfly:devは追従しないのでどちらも同じコンテキストパスにしたいのならfinalName
設定する方が無難でしょう。

    <build>
        <finalName>ROOT</finalName>

パッケージングします。

$ mvn package

できました。デフォルトのファイル名はserver-bootable.jarです。

[INFO] Bootable JAR packaging DONE. To run the server: java -jar /path/to/target/server-bootable.jar

起動してみます。

$ java -jar target/server-bootable.jar

確認。

$ curl localhost:8080/hello
Hello World!!

OKですね。

ところで、Bootable JARのサイズが237MBとけっこうなサイズです…。

$ ll -h target/server-bootable.jar
-rw-rw-r-- 1 xxxxx xxxxx 237M  4月 28 19:34 target/server-bootable.jar

WildFly Glowを使うと必要なWildFlyモジュールを選んでくれるようですが、今回は自分で指定します。

こうしました。

                <configuration>
                    <bootable-jar>true</bootable-jar>
                    <feature-packs>
                        <feature-pack>
                            <location>wildfly@maven(org.jboss.universe:community-universe)#32.0.0.Final</location>
                        </feature-pack>
                    </feature-packs>
                    <layers>
                        <layer>jaxrs-server</layer>
                    </layers>
                </configuration>

すでにプロビジョニング済みのディレクトリがあると再度作成してくれないので、1度mvn cleanしておきます。

$ mvn clean

もしくは以下の設定を追加すると、wildfly:package時に1度プロビジョニング済みのディレクトリを削除して実行してくれるようになります。

                    <overwrite-provisioned-server>true</overwrite-provisioned-server>

パッケージング。

$ mvn package

だいぶ小さくなりましたね。

$ ll -h target/server-bootable.jar
-rw-rw-r-- 1 xxxxx xxxxx 111M  4月 28 19:40 target/server-bootable.jar

最後はbootable-jar-nameを指定してBootable JARファイル名を変更してみます。

                <configuration>
                    <!-- wildfly:dev も使うなら、finalNameで指定した方がよさそう -->
                    <!-- <runtime-name>ROOT.war</runtime-name> -->
                    <bootable-jar>true</bootable-jar>
                    <!-- 指定しない場合は server-bootable.jar になる -->
                    <bootable-jar-name>${project.artifactId}-${project.version}-bootable.jar</bootable-jar-name>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <feature-packs>
                        <feature-pack>
                            <location>wildfly@maven(org.jboss.universe:community-universe)#32.0.0.Final</location>
                        </feature-pack>
                    </feature-packs>
                    <layers>
                        <layer>jaxrs-server</layer>
                    </layers>
                </configuration>

これでパッケージングすると、指定のファイル名でBootable JARを作成してくれます。

[INFO] Bootable JAR packaging DONE. To run the server: java -jar /path/to/target/artifact-name-0.0.1-SNAPSHOT-bootable.jar

なお、完全に蛇足ですがWildFly JAR Maven Pluginと違ってjboss-maven-distが使えないので、開発時にJARファイルをもっと小さく
することはできなさそうです…。

今回はこんなところで。

おわりに

WildFly Maven PluginでBootable JARを作成できるようになったということで、少し試してみました。

そのうちWildFly Glowも組み合わせて使ってみたいと思いますが、それはまたそのうちということで。