CLOVER🍀

That was when it all began.

WildFly Bootable JAR作成時に使う、WildFly JAR Maven Pluginのjboss-maven-distオプションの有効/無効を切り替える

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

WildFly Bootable JARを作成するWildFly JAR Maven Pluginの設定に、jboss-maven-distという設定があります。

<plugin-options>
    <jboss-maven-dist/>
</plugin-options>

こちらについて、ちょっと気になったことがあったので調べてみました。

jboss-maven-dist plugin-opsion

jboss-maven-distというのはWildFly JAR Maven Pluginの設定で、WildFly Bootable JARをスリムにするものです。

具体的には以下のように指定するだけで、JBossモジュールのJARファイルを含まないWildFly Bootable JARを作成できます。

<plugin-options>
    <jboss-maven-dist/>
</plugin-options>

WildFly Bootable JAR Documentation / Advanced usages / Provisioning a slim bootable JAR

この効果としては、WildFly Bootable JARのサイズも小さくなり、起動も高速になるという利点があります。

JBossモジュールのJARファイル自体はどこから取得するかというと、ローカルのMavenリポジトリから、ということになります。

これはこれで開発時には便利なのですが、実際の環境で動かす時には必要なJARファイルをすべて含んだものを作成した方がよいでしょう。
となると、ドキュメントを見ていてもjboss-maven-distには設定の切り替えを行うような例がなかったので、jboss-maven-distを
含む・含まないでMavenのプロファイルあたりで切り替えるのが良いのかなと思っていたのですが。

ソースコードを眺めていると、どうもtrue/falseで切り替えられそうな雰囲気がありました。

    private boolean isThinServer() throws ProvisioningException {
        if (!pluginOptions.containsKey(JBOSS_MAVEN_DIST)) {
            return false;
        }
        final String value = pluginOptions.get(JBOSS_MAVEN_DIST);
        return value == null ? true : Boolean.parseBoolean(value);
    }

https://github.com/wildfly-extras/wildfly-jar-maven-plugin/blob/8.0.1.Final/plugin/src/main/java/org/wildfly/plugins/bootablejar/maven/goals/AbstractBuildBootableJarMojo.java#L1545-L1551

plugin-optionsの説明を見ても、その配下で指定できるオプションについては書かれていませんからね。

WildFly Bootable JAR Documentation / Maven Plugin / dev / Parameter Details / pluginOptions

今回、ちょっと試してみることにしました。

環境

今回の環境は、こちら。

$ java --version
openjdk 17.0.4 2022-07-19
OpenJDK Runtime Environment (build 17.0.4+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.4+8-Ubuntu-120.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 17.0.4, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-131-generic", arch: "amd64", family: "unix"

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

簡単にアプリケーションを作成します。

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>org.littlewings</groupId>
    <artifactId>wildfly-bootable-jar-switch-jboss-maven-dist</artifactId>
    <version>0.0-1-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>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-jar-maven-plugin</artifactId>
                <version>8.0.1.Final</version>
                <configuration>
                    <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#26.1.2.Final</feature-pack-location>
                    <layers>
                        <layer>jaxrs-server</layer>
                    </layers>
                    <plugin-options>
                        <jboss-maven-dist/>
                    </plugin-options>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

CDI管理Bean。

src/main/java/org/littlewings/wildfly/bootable/MessageService.java

package org.littlewings.wildfly.bootable;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MessageService {
    public String get() {
        return "Hello WildFly Bootable JAR!!";
    }
}

JAX-RSリソースクラス。

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

package org.littlewings.wildfly.bootable;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hello")
public class HelloResource {
    @Inject
    MessageService messageService;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String message() {
        return messageService.get();
    }
}

JAX-RSの有効化。

src/main/java/org/littlewings/wildfly/bootable/JaxrsActivator.java

package org.littlewings.wildfly.bootable;

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

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

さらっと流しましたが、WildFly JAR Maven Pluginの設定はこんな感じです。

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-jar-maven-plugin</artifactId>
                <version>8.0.1.Final</version>
                <configuration>
                    <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#26.1.2.Final</feature-pack-location>
                    <layers>
                        <layer>jaxrs-server</layer>
                    </layers>
                    <plugin-options>
                        <jboss-maven-dist/>
                    </plugin-options>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

WildFly 26.1.2.Finalを使ってBootable JARを作成するようにして、レイヤーはjaxrs-serverを選択。

そして、<jboss-maven-dist/>を追加。

パッケージングしてみる

とりあえず、パッケージングしてみましょう。

$ mvn package

手元の環境では、11秒ほどでパッケージングが終わりました。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.116 s
[INFO] Finished at: 2022-10-22T20:39:03+09:00
[INFO] ------------------------------------------------------------------------

WildFly Bootable JARのサイズは、1.7Mほどです。

$ ll -h target/wildfly-bootable-jar-switch-jboss-maven-dist-0.0-1-SNAPSHOT-bootable.jar
-rw-rw-r-- 1 xxxxx xxxxx 1.7M 10月 22 20:39 target/wildfly-bootable-jar-switch-jboss-maven-dist-0.0-1-SNAPSHOT-bootable.jar

起動。

$ java -jar target/wildfly-bootable-jar-switch-jboss-maven-dist-0.0-1-SNAPSHOT-bootable.jar

起動にかかった時間。

20:40:29,812 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 26.1.2.Final (WildFly Core 18.1.2.Final) started in 3585ms - Started 264 of 349 services (138 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml

確認。

$ curl localhost:8080/hello
Hello WildFly Bootable JAR!

開発中はwildfly-jar:dev-watchを使うと、ソースコードを変更すると再ビルドが行われてアプリケーションに反映されるので便利です。

$ mvn wildfly-jar:dev-watch
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /path/to/wildfly-bootable-jar-switch-jboss-maven-dist/target/classes
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Exploding webapp
[INFO] Assembling webapp [wildfly-bootable-jar-switch-jboss-maven-dist] in [/path/to/wildfly-bootable-jar-switch-jboss-maven-dist/target/deployments/ROOT.war]
[INFO] Processing war project
20:42:41,902 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 46) WFLYUT0022: Unregistered web context: '/' from server 'default-server'
20:42:41,907 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 6ms
20:42:41,917 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0009: Undeployed "ROOT.war" (runtime-name: "ROOT.war")
20:42:41,922 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
20:42:41,984 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) WFLYWELD0003: Processing weld deployment ROOT.war
20:42:42,184 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 48) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.littlewings.wildfly.bootable.JaxrsActivator
20:42:42,186 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 48) WFLYUT0021: Registered web context: '/' for server 'default-server'
20:42:42,198 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")
[INFO] Nothing to compile - all classes are up to date
[INFO] Exploding webapp
[INFO] Assembling webapp [wildfly-bootable-jar-switch-jboss-maven-dist] in [/path/to/wildfly-bootable-jar-switch-jboss-maven-dist/target/deployments/ROOT.war]
[INFO] Processing war project
20:42:42,235 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 48) WFLYUT0022: Unregistered web context: '/' from server 'default-server'
20:42:42,244 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0028: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 9ms
20:42:42,258 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0009: Undeployed "ROOT.war" (runtime-name: "ROOT.war")
20:42:42,266 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
20:42:42,314 INFO  [org.jboss.weld.deployer] (MSC service thread 1-4) WFLYWELD0003: Processing weld deployment ROOT.war
20:42:42,441 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 49) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.littlewings.wildfly.bootable.JaxrsActivator
20:42:42,444 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 49) WFLYUT0021: Registered web context: '/' for server 'default-server'
20:42:42,450 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")

jboss-maven-distを無効にしてみる

次は、jboss-maven-distを無効にしてみましょう。以下のようにコメントアウトしておきます。

                    <plugin-options>
                        <!-- <jboss-maven-dist/> -->
                    </plugin-options>

パッケージング。

$ mvn package

先ほどの2倍ほど時間がかかるようになりました。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  22.945 s
[INFO] Finished at: 2022-10-22T20:45:41+09:00
[INFO] ------------------------------------------------------------------------

起動してみます。

$ java -jar target/wildfly-bootable-jar-switch-jboss-maven-dist-0.0-1-SNAPSHOT-bootable.jar

この速度は、今回は差がなさそうです。

20:46:16,981 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 26.1.2.Final (WildFly Core 18.1.2.Final) started in 3132ms - Started 264 of 349 services (138 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml

wildfly-jar:dev-watchを使った場合は、ソースコードの変更を反映する時の差は感じられませんが、最初の起動時はJARファイルを作成する分だけ
差が出ますね。

$ mvn wildfly-jar:dev-watch

というわけで、アプリケーションを作っている時はjboss-maven-distを有効にしたいな、とちょっと思ったりします。

jboss-maven-distにtrue/falseを指定する

で、ドキュメントを見ていると気づかないのですが、jboss-maven-distには以下のようにbooleanの値を指定して有効/無効を切り替えることが
できるようです。

trueとすれば有効になりますし、

                    <plugin-options>
                        <jboss-maven-dist>true</jboss-maven-dist>
                    </plugin-options>

falseで無効になります。

                    <plugin-options>
                        <jboss-maven-dist>false</jboss-maven-dist>
                    </plugin-options>

つまり、以下の2つの記述は同義だということになります。

                    <plugin-options>
                        <jboss-maven-dist/>
                    </plugin-options>


                    <plugin-options>
                        <jboss-maven-dist>true</jboss-maven-dist>
                    </plugin-options>

確認結果は、コメントアウトして切り替えていた時と同じなので割愛。

これを利用すると、プロパティで切り替えたりできそうですね。
こんな感じにして、切り替えたりするとよいのではないでしょうか。

    <properties>
        〜省略〜

        <wildfly.bootable.jar.slim.enable>false</wildfly.bootable.jar.slim.enable>
    </properties>

        〜省略〜

                    <plugin-options>
                        <jboss-maven-dist>${wildfly.bootable.jar.slim.enable}</jboss-maven-dist>
                    </plugin-options>

開発中はjboss-maven-distを有効にして、

$ mvn wildfly-jar:dev-watch -Dwildfly.bootable.jar.slim.enable=true

パッケージングする時には有効にしておくとかでしょうか。

$ mvn package

今回確認したかったのは、ここまでですね。

最後に、この修正を入れたpom.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>org.littlewings</groupId>
    <artifactId>wildfly-bootable-jar-switch-jboss-maven-dist</artifactId>
    <version>0.0-1-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>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <failOnMissingWebXml>false</failOnMissingWebXml>

        <wildfly.bootable.jar.slim.enable>false</wildfly.bootable.jar.slim.enable>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-jar-maven-plugin</artifactId>
                <version>8.0.1.Final</version>
                <configuration>
                    <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#26.1.2.Final</feature-pack-location>
                    <layers>
                        <layer>jaxrs-server</layer>
                    </layers>
                    <plugin-options>
                        <jboss-maven-dist>${wildfly.bootable.jar.slim.enable}</jboss-maven-dist>
                    </plugin-options>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

まとめ

WildFly Bootable JARを作る時に使う、WildFly JAR Maven Pluginのjboss-maven-distの有効/無効を切り替えられることを確認してみました。

個人的にWildFly Bootable JARは便利で、Java EE/Jakarta EEアプリケーション作成時の確認の際にデプロイせずとも良いですし、
wildfly-jar:dev-watchがソースコードの変更を反映してくれるので楽です。

最終的にWildFlyにデプロイする場合は、WildFly Bootable JARを作成するかどうかはMavenのプロファイルで分けたりすればよいと思うので
用途に合わせて使い分けていきたいですね。