CLOVER🍀

That was when it all began.

WildFly Maven Pluginのdevゎヌルで、Jakarta EEアプリケヌションの開発を始める

これは、なにをしたくお曞いたもの

Jakarta EEアプリケヌションを開発する時に、WildFly Maven Pluginのdevゎヌルを䜿ったりするず楜そうだなず思ったので、ちょっず
詊しおみるこずにしたした。

同じような発想でWildFly Bootable JARを詊したこずはありたすが、WildFly Maven Pluginはデプロむアンデプロむくらいでしか
䜿ったこずがないので。

しかも、過去の゚ントリヌを芋るずWildFlyベヌスだったInfinispan Serverぞのデプロむに䜿ったりしおいたした 。

WildFly Maven Pluginで、WildFly/Infinispan Serverにデプロイする - CLOVER🍀

WildFly Maven Plugin

WildFly Maven Pluginは、Gallenを䜿っおWildFlyサヌバヌをプロビゞョニングし、WildFlyサヌバヌぞのデプロむ、再デプロむ、
アンデプロむやアプリケヌションの実行ができるMavenプラグむンです。

The wildfly-maven-plugin is used to provision a server using Galleon, package your application in Galleon provisioned server, deploy, redeploy, undeploy or run your application.

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

珟バヌゞョンは、4.2.0.Finalです。

䜿い方は、こちらを芋぀぀

それから興味のあるゎヌルの個々のペヌゞを芋るずよいでしょう。

WildFly Maven Plugin (wildfly-maven-plugin) / Goals Overview

サンプルもありたす。

WildFly Maven Plugin (wildfly-maven-plugin) / Examples

甚意されおいるゎヌルずしおは、ざっくり以䞋の感じみたいですね。

  • WildFlyの起動、停止
  • WildFlyぞのアプリケヌションのデプロむ、再デプロむ、アンデプロむ
  • WildFlyサヌバヌのプロビゞョニング、アプリケヌションを含んだWildFlyサヌバヌのプロビゞョニング
    • コンテナむメヌゞの䜜成
  • WildFlyサヌバヌぞのリ゜ヌスの远加、コマンドの実行
  • WildFlyサヌバヌを起動し、アプリケヌションの゜ヌスコヌドの倉曎を監芖しおビルド、再デプロむ

今回は䞻に最埌に曞いたdevゎヌルに぀いお、詊しおいきたいず思いたす。

WildFly Maven Plugin – wildfly:dev

wildfly:dev

devゎヌルは、WildFlyサヌバヌを起動しおアプリケヌションをパッケヌゞング、デプロむしたす。その埌、アプリケヌションの゜ヌスコヌドの
倉曎を監芖しお、倉曎があった堎合は再床パッケヌゞング、再デプロむを行いたす。

WildFly Maven Plugin – wildfly:dev

WildFly Maven Plugin 4.1.0.Finalから䜿えるゎヌルみたいなので、割ず最近2023幎4月の機胜なんですね。

Release 4.1.0.Final · wildfly/wildfly-maven-plugin · GitHub

今回は、こちらを䜿っお簡単なJakarta EEアプリケヌションを䜜っお詊しおみたいず思いたす。

環境

今回の環境は、こちら。

$ java --version
openjdk 17.0.8.1 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu122.04, mixed mode, sharing)


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

準備

Mavenプロゞェクトの構成は、こんな感じにしたした。

    <groupId>...</groupId>
    <artifactId>...</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>
    </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>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.4.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>4.2.0.Final</version>
                <configuration>
                    <version>29.0.1.Final</version>
                    <server-config>standalone.xml</server-config>
                </configuration>
            </plugin>
        </plugins>
    </build>

Jakarta EEはWeb Profileで10を䜿うこずにしたす。

WildFly Maven Pluginはこちらですね。

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>4.2.0.Final</version>
                <configuration>
                    <version>29.0.1.Final</version>
                    <server-config>standalone.xml</server-config>
                </configuration>
            </plugin>

蚭定は、最䜎限versionは指定した方が良いかなず。未指定だず、最新安定版のWildFlyをダりンロヌドしおきたす。
たた、server-configでは䜿甚する蚭定ファむルを指定しおいたす。

アプリケヌションを䜜成する

ひずたず、簡単なJakarata EEアプリケヌションを䜜りたす。たずはJakarta RESTful Web ServicesJAX-RSから。

JAX-RSの有効化。

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

package org.littlewings.wildfly.maven;

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

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

JAX-RSリ゜ヌスクラス。

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

package org.littlewings.wildfly.maven;

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:devゎヌルを実行したす。

$ mvn wildfly:dev

初回はWildFlyに関するアヌティファクトをダりンロヌドしおくるので、それなりに時間がかかりたす。

それからWildFlyをプロビゞョニングしお起動、

[INFO] --- wildfly:4.2.0.Final:dev (default-cli) @ ... ---
[INFO] Provisioning default server in /path/to/target/server
[INFO] JBoss Threads version 2.4.0.Final
[INFO] JBoss Remoting version 5.0.27.Final
[INFO] XNIO version 3.8.9.Final
[INFO] XNIO NIO Implementation Version 3.8.9.Final
[INFO] ELY00001: WildFly Elytron version 2.2.1.Final
[INFO] JAVA_HOME : /usr/lib/jvm/java-17-openjdk-amd64
[INFO] JBOSS_HOME: /path/to/target/server
[INFO] JAVA_OPTS : -Xms64m -Xmx512m -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Djboss.modules.system.pkgs=org.jboss.byteman --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-modules=java.se
[INFO] STANDALONE server is starting up.

〜省略〜

21:33:26,953 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
21:33:26,953 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
21:33:26,954 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 29.0.1.Final (WildFly Core 21.1.1.Final) started in 2855ms - Started 280 of 522 services (317 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml

アプリケヌションをパッケヌゞングしおデプロむしたす。

[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 2 source files with javac [debug target 17] to target/classes
[INFO] Exploding webapp
[INFO] Assembling webapp [...] in [/path/to/target/ROOT]
[INFO] Processing war project
21:33:28,359 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
21:33:29,187 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 22) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class org.littlewings.wildfly.maven.JaxrsActivator
21:33:29,220 INFO  [org.hibernate.validator.internal.util.Version] (ServerService Thread Pool -- 22) HV000001: Hibernate Validator 8.0.0.Final
21:33:29,239 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 22) WFLYUT0021: Registered web context: '/' for server 'default-server'
21:33:29,299 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")

この状態でアプリケヌションはデプロむされおいるので、アクセスしお確認するこずができたす。

$ curl localhost:8080/hello
Hello World

ここでmvn wildfly:devは実行したたた、゜ヌスコヌドを少し倉曎しおみたす。

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

するず、倉曎が怜知されお再床パッケヌゞングず再デプロむが行われたす。

[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 2 source files with javac [debug target 17] to target/classes
[INFO] Exploding webapp
[INFO] Assembling webapp [...] in [/path/to/target/ROOT]
[INFO] Processing war project
21:33:28,359 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
21:33:29,187 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 22) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class org.littlewings.wildfly.maven.JaxrsActivator
21:33:29,220 INFO  [org.hibernate.validator.internal.util.Version] (ServerService Thread Pool -- 22) HV000001: Hibernate Validator 8.0.0.Final
21:33:29,239 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 22) WFLYUT0021: Registered web context: '/' for server 'default-server'
21:33:29,299 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 2 source files with javac [debug target 17] to target/classes
[INFO] Exploding webapp
[INFO] Assembling webapp [...] in [/path/to/target/ROOT]
[INFO] Processing war project
21:36:25,861 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 22) WFLYUT0022: Unregistered web context: '/' from server 'default-server'
21:36:25,880 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-5) WFLYSRV0028: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 22ms
21:36:25,885 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
21:36:26,004 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 81) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class org.littlewings.wildfly.maven.JaxrsActivator
21:36:26,006 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 81) WFLYUT0021: Registered web context: '/' for server 'default-server'
21:36:26,026 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0013: Redeployed "ROOT.war"
[INFO] Nothing to compile - all classes are up to date
[INFO] Exploding webapp
[INFO] Assembling webapp [...] in [/path/to/target/ROOT]
[INFO] Processing war project
21:36:26,042 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 22) WFLYUT0022: Unregistered web context: '/' from server 'default-server'
21:36:26,047 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 5ms
21:36:26,048 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-5) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
21:36:26,248 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 22) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class org.littlewings.wildfly.maven.JaxrsActivator
21:36:26,251 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 22) WFLYUT0021: Registered web context: '/' for server 'default-server'
21:36:26,268 INFO  [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0013: Redeployed "ROOT.war"

確認。

$ curl localhost:8080/hello
Hello World!!

倉曎が反映されおいたす。

䟿利ですね。

ずころで、「WildFlyサヌバヌをプロビゞョニングする」ず蚀っおいたしたが、これはどういうこずかずいうずtarget/serverディレクトリ
provisioningDirで倉曎可胜にWildFlyが構築されるこずを指しおいたす。

$ ll target/server
合蚈 524
drwxrwxr-x 12 xxxxx xxxxx   4096  9月 18 21:33 ./
drwxrwxr-x  7 xxxxx xxxxx   4096  9月 18 21:33 ../
drwxrwxr-x  3 xxxxx xxxxx   4096  9月 18 21:33 .galleon/
drwxrwxr-x  2 xxxxx xxxxx   4096  9月 18 21:33 .installation/
drwxrwxr-x  3 xxxxx xxxxx   4096  9月 18 21:33 .well-known/
-rw-rw-r--  1 xxxxx xxxxx  26530  9月 18 21:32 LICENSE.txt
-rw-rw-r--  1 xxxxx xxxxx   2161  9月 18 21:32 README.txt
drwxrwxr-x  3 xxxxx xxxxx   4096  9月 18 21:32 appclient/
drwxrwxr-x  3 xxxxx xxxxx   4096  9月 18 21:32 bin/
-rw-rw-r--  1 xxxxx xxxxx  19358  9月 18 21:32 copyright.txt
drwxrwxr-x  6 xxxxx xxxxx   4096  9月 18 21:32 docs/
drwxrwxr-x  4 xxxxx xxxxx   4096  9月 18 21:33 domain/
-rw-rw-r--  1 xxxxx xxxxx 431393  9月 18 21:33 jboss-modules.jar
drwxrwxr-x  3 xxxxx xxxxx   4096  9月 18 21:32 modules/
drwxrwxr-x  8 xxxxx xxxxx   4096  9月 18 21:33 standalone/
drwxrwxr-x  2 xxxxx xxxxx   4096  9月 18 21:32 welcome-content/

蚭定ファむルなどもしっかりありたす。

$ ll target/server/standalone/configuration
合蚈 244
drwxrwxr-x 3 xxxxx xxxxx  4096  9月 18 21:36 ./
drwxrwxr-x 8 xxxxx xxxxx  4096  9月 18 21:33 ../
-rw------- 1 xxxxx xxxxx   711  9月 18 21:32 application-roles.properties
-rw------- 1 xxxxx xxxxx   935  9月 18 21:32 application-users.properties
-rw-rw-r-- 1 xxxxx xxxxx  1754  9月 18 21:33 logging.properties
-rw------- 1 xxxxx xxxxx   669  9月 18 21:32 mgmt-groups.properties
-rw------- 1 xxxxx xxxxx  1112  9月 18 21:32 mgmt-users.properties
-rw-rw-r-- 1 xxxxx xxxxx 38419  9月 18 21:33 standalone-full-ha.xml
-rw-rw-r-- 1 xxxxx xxxxx 32949  9月 18 21:33 standalone-full.xml
-rw-rw-r-- 1 xxxxx xxxxx 34548  9月 18 21:33 standalone-ha.xml
-rw-rw-r-- 1 xxxxx xxxxx 12643  9月 18 21:33 standalone-load-balancer.xml
-rw-rw-r-- 1 xxxxx xxxxx 26082  9月 18 21:33 standalone-microprofile-ha.xml
-rw-rw-r-- 1 xxxxx xxxxx 22920  9月 18 21:33 standalone-microprofile.xml
-rw-rw-r-- 1 xxxxx xxxxx 29855  9月 18 21:36 standalone.xml
drwxrwxr-x 4 xxxxx xxxxx  4096  9月 18 21:36 standalone_xml_history/

Jakarta PersistenceJPAを䜿う

JAX-RSだけで終わっおもなんなので、JPAも䜿っおみたしょう。

wildfly:devゎヌルを実行しおいるタヌミナルは、1床停止したす。

JPAを䜿うずいうこずは、JDBCドラむバヌやデヌタ゜ヌスを登録するこずになりたす。

そういったサンプルはこちらにありたすが、devゎヌルずはちょっず盞性が悪いです。PostgreSQLのJDBCドラむバヌずデヌタ゜ヌスを
デプロむ、登録するサンプルになっおいるのですが、これはすでに起動枈みのWildFlyを利甚するものだからですね。
※devゎヌルでもリモヌトのWildFlyを䜿うように蚭定するこずはできたす

WildFly Maven Plugin – Adding Resources Examples

起動枈みのWildFlyを䜿う堎合は、以降の蚘茉は読み飛ばしおよいでしょう。

今回の構成で進める堎合はどうするかずいうず、JDBCドラむバヌやデヌタ゜ヌスを組み蟌んだWildFlyをプロビゞョニングしたす。

これにはGalleonを䜿うこずになりたす。

Galleon Provisioning Guide

以前、WildFly Bootable JARを詊しおいる時に少し調べおみたした。

WildFly Bootable JARを作る時に指定するGalleon layer、Galleon feature-packというものを少し見てみたい - CLOVER🍀

Galleonを䜿うこずで、WildFlyを奜きな構成に組み䞊げるこずができたす。

WildFly Maven Pluginで、こちらに特化した゚ントリヌはこちらを参照しおください。

WildFly Maven Pluginで、WildFlyをプロビジョニングしたり、アプリケーションを含めたりする - CLOVER🍀

デヌタ゜ヌスずJDBCドラむバヌのデプロむには、WildFly DataSources Galleon Feature Packを䜿甚したす。

GitHub - wildfly-extras/wildfly-datasources-galleon-pack: WildFly Feature Pack for DataSources

これはWildFly Bootable JARでも䜿ったこずがありたす。

WildFly Bootable JARに、DataSourceを組み込む - CLOVER🍀

䜿甚するデヌタベヌスは、MySQLずしたす。MySQLは8.0.34で、IPアドレスは172.17.0.2で動䜜しおいるものずしたす。

 MySQL  localhost:3306 ssl  practice  SQL > select version();
+-----------+
| version() |
+-----------+
| 8.0.34    |
+-----------+
1 row in set (0.0006 sec)

WildFly Maven Pluginの蚭定は、最終的にこうなりたした。

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>4.2.0.Final</version>
                <configuration>
                    <feature-packs>
                        <feature-pack>
                            <location>wildfly@maven(org.jboss.universe:community-universe)#29.0.1.Final</location>
                        </feature-pack>
                        <feature-pack>
                            <location>org.wildfly:wildfly-datasources-galleon-pack:5.0.0.Final</location>
                        </feature-pack>
                    </feature-packs>
                    <layers>
                        <layer>jaxrs-server</layer>
                        <layer>mysql-datasource</layer>
                    </layers>
                    <env>
                        <MYSQL_DATASOURCE>MySqlDs</MYSQL_DATASOURCE>
                        <MYSQL_JNDI>java:jboss/datasources/MySqlDs</MYSQL_JNDI>
                        <MYSQL_URL>jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&amp;connectionCollation=utf8mb4_0900_bin</MYSQL_URL>
                        <MYSQL_USER>kazuhira</MYSQL_USER>
                        <MYSQL_PASSWORD>password</MYSQL_PASSWORD>
                        <MYSQL_ENABLED>true</MYSQL_ENABLED>
                    </env>
                </configuration>
            </plugin>

WildFly DataSources Galleon Feature Packの方にWildFly Maven PluginずWildFly JAR Maven Pluginのサンプルがあるのですが、
こちらを参考に。

Provisioning using the WildFly Maven Plugin or the WildFly JAR Maven plugin

GalleonのFeature Packずしお、WildFly 29.0.1.FinalずWildFly DataSources Galleon Feature Packを指定。

                    <feature-packs>
                        <feature-pack>
                            <location>wildfly@maven(org.jboss.universe:community-universe)#29.0.1.Final</location>
                        </feature-pack>
                        <feature-pack>
                            <location>org.wildfly:wildfly-datasources-galleon-pack:5.0.0.Final</location>
                        </feature-pack>
                    </feature-packs>

レむダヌにはjaxrs-serverずmysql-datasourceを遞択。

                    <layers>
                        <layer>jaxrs-server</layer>
                        <layer>mysql-datasource</layer>
                    </layers>

jaxrs-serverレむダヌに぀いおは、こちらに蚘茉がありたす。ざっくり、JAX-RS、CDI、JPAが䜿えるWildFlyを構築できる、くらいに
捉えおおけばよいず思いたす。

Galleon Provisioning Guide

mysql-datasourceはWildFly DataSources Galleon Feature Packが提䟛するレむダヌです。

MySQLのJDBCドラむバヌは、mysql-datasourceレむダヌを加えるずデプロむされたす。
あずは、デヌタ゜ヌスの蚭定を行いたす。蚭定は接続先のデヌタベヌスごずにあるのですが、MySQLの堎合はこちら。

https://github.com/wildfly-extras/wildfly-datasources-galleon-pack/blob/5.0.0.Final/doc/mysql/README.md

蚭定は、今回は環境倉数で行うこずにしたした。

                    <env>
                        <MYSQL_DATASOURCE>MySqlDs</MYSQL_DATASOURCE>
                        <MYSQL_JNDI>java:jboss/datasources/MySqlDs</MYSQL_JNDI>
                        <MYSQL_URL>jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&amp;connectionCollation=utf8mb4_0900_bin</MYSQL_URL>
                        <MYSQL_USER>kazuhira</MYSQL_USER>
                        <MYSQL_PASSWORD>password</MYSQL_PASSWORD>
                        <MYSQL_ENABLED>true</MYSQL_ENABLED>
                    </env>

これで、WildFly偎の準備はできたした。

あずはJPAを䜿うようにアプリケヌションに゜ヌスコヌドを远加したす。

Persistence Unitの蚭定。WildFly Maven Pluginによっお構成されるデヌタ゜ヌスを䜿うようにしおいたす。

src/main/resources/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
             version="3.0">
    <persistence-unit name="sample.pu" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:jboss/datasources/MySqlDs</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>
        </properties>
    </persistence-unit>
</persistence>

スキヌマ生成は、今回は簡単にdrop-and-createにしおおきたした 。

JPAの゚ンティティ。

src/main/java/org/littlewings/wildfly/maven/Book.java

package org.littlewings.wildfly.maven;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "book")
public class Book {
    @Id
    private String isbn;

    private String title;

    private Integer price;

    // gettersetterは省略
}

EntityManagerを䜿う、JAX-RSリ゜ヌスクラス。

src/main/java/org/littlewings/wildfly/maven/BookResource.java

package org.littlewings.wildfly.maven;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;

import java.util.List;

@ApplicationScoped
@Path("book")
public class BookResource {
    @PersistenceContext
    EntityManager entityManager;

    @GET
    @Path("{isbn}")
    @Produces(MediaType.APPLICATION_JSON)
    @Transactional
    public Book find(@PathParam("isbn") String isbn) {
        return entityManager.find(Book.class, isbn);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Transactional
    public List<Book> findAll() {
        return entityManager
                .createQuery("select b from Book b order by b.price desc", Book.class)
                .getResultList();
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Transactional
    public Book register(Book book) {
        if (entityManager.find(Book.class, book.getIsbn()) != null) {
            entityManager.merge(book);
        } else {
            entityManager.persist(book);
        }

        return book;
    }
}

ここたで蚭定したら、1床mvn cleanしおおきたす。プロビゞョニング枈みのWildFlyがあるず、蚭定を倉えおも再プロビゞョニングされない
みたいなので。

$ mvn clean

では、起動。

$ mvn wildfly:dev

するず、WildFlyサヌバヌがプロビゞョニングされるのですが、少しログの雰囲気が倉わりたす。

[INFO] --- wildfly:4.2.0.Final:dev (default-cli) @ ... ---
[INFO] Provisioning server in /path/to/target/server
[INFO] Resolving feature-packs
[INFO] Installing packages
[INFO] Resolving artifacts
[INFO] Generating configurations
[INFO] JBoss Modules version 2.1.0.Final

〜省略〜

GalleonのFeature Packを䜿っおいるこずがわかりたす。

確認。

$ curl -XPOST -H 'Content-Type: application/json' http://localhost:8080/book -d '{"isbn": "978-4774183169", "title": "パヌフェクト Java EE", "price": 3520}'
{"isbn":"978-4774183169","price":3520,"title":"パヌフェクト Java EE"}


$ curl http://localhost:8080/book
[{"isbn":"978-4774183169","price":3520,"title":"パヌフェクト Java EE"}]


$ curl http://localhost:8080/book/978-4774183169
{"isbn":"978-4774183169","price":3520,"title":"パヌフェクト Java EE"}

OKですね。

なお、今回はpersistence.xmlに以䞋のように指定したので、゜ヌスコヌドを倉曎する床にテヌブルが再䜜成されるので泚意を 。

            <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>

おわりに

WildFly Maven Pluginのdevゎヌルを詊しおみたした。

なんずなく、簡単にJAX-RSを詊しおそれからJPAを詊しおおわり くらいに思っおいお、Galleonは今回は出さない぀もりだったのですが、
この䜿い方だずGalleonを䜿っお構成しないずどうにもならなくなったので、こうなりたした 。
思った以䞊に長くなりたしたね 。

WildFly Maven PluginずGalleonを䜿ったプロビゞョニングは、別の機䌚にたた深堀したいかなず思いたす。