これは、なにをしたくて書いたもの?
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); }
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のプロファイルで分けたりすればよいと思うので
用途に合わせて使い分けていきたいですね。