これは、なにをしたくて書いたもの?
前にWildFly Maven Pluginを調べた時に、JDBCドライバのデプロイやDataSourceの作成ができそうだったので、試してみたいなと。
JDBCドライバをダウンロードしてきてstandalone/deployments
ディレクトリに置いて…というのは、ちょっと面倒だなぁと
思っていたので。
wildfly:deploy-artifactとwildfly:add-resource
今回使うのは、wildfly:deploy-artifact
とwildfly:add-resource
の2つです。
wildfly:deploy-artifact
でJDBCドライバをデプロイして、wildfly:add-resource
でDataSourceを作成します。
ドキュメントは、それぞれこちら。
WildFly Maven Plugin – wildfly:deploy-artifact
WildFly Maven Plugin – wildfly:add-resource
そのものズバリなサンプルが、こちらにあります。
- Deploy/Undeploy Examples / Deploying other artifacts
- JDBCドライバのデプロイのサンプル
- Adding Resources Examples / Adding datasources
- DataSourceおよび、JDBCドライバ+DataSourceを追加するサンプル
パッと見、そんなに大変そうではありませんが、ポイントは以下ですね。
The artifact must be already listed as a dependency in the projects’ pom.xml.
デプロイ対象、今回でいえばJDBCドライバはプロジェクト内の依存関係に含まれている必要があります。
サンプルではPostgreSQLのJDBCドライバをデプロイしていますが、バージョンの指定がないのは別途依存関係を指定しているからだと
思います。
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <executions> <execution> <phase>install</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <name>postgresql.jar</name> </configuration> </execution> </executions> </plugin>
今回は、MySQLで試してみたいと思います。
環境
今回の環境は、こちら。
$ 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-84-generic", arch: "amd64", family: "unix"
WildFlyはローカルで動作しているものとし、29.0.1.Finalを使います。
$ bin/standalone.sh --version ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /path/to/wildfly-29.0.1.Final JAVA: /usr/lib/jvm/default/bin/java JAVA_OPTS: -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldaps=ALL-UNNAMED --add-exports=jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Djava.security.manager=allow ========================================================================= 23:01:03,501 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.0.Final WildFly Full 29.0.1.Final (WildFly Core 21.1.1.Final)
起動。
$ bin/standalone.sh
MySQL localhost:3306 ssl practice SQL > select version(); +-----------+ | version() | +-----------+ | 8.0.34 | +-----------+ 1 row in set (0.0006 sec)
MySQLは172.17.0.3で動作しているものとして、データベースおよびユーザーは作成済みとします。
Maven設定
まず、シンプルなMaven設定はこちら。
<groupId>org.littlewings</groupId> <artifactId>xxxxx</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> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <executions> <execution> <id>deploy-artifact</id> <phase>package</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <name>mysql</name> </configuration> </execution> <execution> <id>add-datasource</id> <phase>package</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <address>subsystem=datasources,data-source=MySqlDs</address> <resources> <resource> <properties> <jndi-name>java:jboss/datasources/MySqlDs</jndi-name> <enabled>true</enabled> <connection-url><![CDATA[jdbc:mysql://172.17.0.3:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin]]></connection-url> <driver-name>mysql</driver-name> <user-name>kazuhira</user-name> <password>password</password> </properties> </resource> </resources> </configuration> </execution> <execution> <id>deploy</id> <phase>package</phase> <goals> <goal>deploy</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version>
JDBCドライバのデプロイの設定はこちら。
<execution> <id>deploy-artifact</id> <phase>package</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <name>mysql</name> </configuration> </execution>
groupId
、artifactId
でデプロイ対象のアーティファクトを指定しています。name
はデプロイする時の名前を指定します。
ここでversion
がありませんが、これはプロジェクト側の依存関係に含まれている必要があります。
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <scope>provided</scope> </dependency>
あとで別構成の設定も書きますが、なんとなくこのあたりのMavenプロファイルは分けた方がいい気がします…。
DataSourceの作成はこちら。
<execution> <id>add-datasource</id> <phase>package</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <address>subsystem=datasources,data-source=MySqlDs</address> <resources> <resource> <properties> <jndi-name>java:jboss/datasources/MySqlDs</jndi-name> <enabled>true</enabled> <connection-url><![CDATA[jdbc:mysql://172.17.0.3:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin]]></connection-url> <driver-name>mysql</driver-name> <user-name>kazuhira</user-name> <password>password</password> </properties> </resource> </resources> </configuration> </execution>
address
で操作対象を指定します。properties
内には、追加するリソースのプロパティを設定します。
設定できるプロパティは、各サブシステムのリファレンスを見るとよいでしょう。
DataSourceの場合はこちら。
WildFly Full 29 Model Reference / home / subsystem=datasources / data-source=ExampleDS
ところで、今回はpackage
ゴールに紐付けているのですが。
<phase>package</phase>
これらwildfly:deploy-artifact
やwildfly:add-resource
はmvn wildfly:deploy-artifact
のような実行方法ではちょっと扱いづらく、なんらかの
ゴールに結びつけた方が良さそうです。サンプルでは、package
やinstall
に紐付けています。
今回は、wildfly:deploy
も含めるようにしました。
<execution> <id>deploy</id> <phase>package</phase> <goals> <goal>deploy</goal> </goals> </execution>
サンプルアプリケーションと動作確認
動作確認してみます。
簡単なJAX-RSアプリケーションを作成。
src/main/java/org/littlewings/wildfly/datasource/JaxrsActivator.java
package org.littlewings.wildfly.datasource; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; @ApplicationPath("") public class JaxrsActivator extends Application { }
DataSource
をJNDIルックアップするJAX-RSリソースクラス。
src/main/java/org/littlewings/wildfly/datasource/HelloResource.java
package org.littlewings.wildfly.datasource; import jakarta.annotation.Resource; import jakarta.enterprise.context.ApplicationScoped; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @ApplicationScoped @Path("hello") public class HelloResource { @Resource(lookup = "java:jboss/datasources/MySqlDs") private DataSource dataSource; @GET @Produces(MediaType.TEXT_PLAIN) public String now() throws SQLException { try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement("select now()"); ResultSet rs = ps.executeQuery()) { rs.next(); return rs.getString(1); } } }
SQLは、現在時刻を返すだけです。
デプロイします。
$ mvn package
これで、JDBCドライバのデプロイ → DataSourceの作成 → WARファイルのデプロイが行われます。
23:22:15,837 INFO [org.jboss.as.repository] (management-handler-thread - 1) WFLYDR0001: Content added at location /path/to/wildfly-29.0.1.Final/standalone/data/content/9e/64d997873abc4318620264703d3fdb6b02dd5a/content 23:22:15,864 INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) WFLYSRV0027: Starting deployment of "mysql" (runtime-name: "mysql") 23:22:17,043 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) WFLYJCA0005: Deploying non-JDBC-compliant driver class com.mysql.cj.jdbc.Driver (version 8.0) 23:22:17,054 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-8) WFLYJCA0018: Started Driver service with driver-name = mysql 23:22:17,145 INFO [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "mysql" (runtime-name : "mysql") 23:22:17,254 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-5) WFLYJCA0001: Bound data source [java:jboss/datasources/MySqlDs] 23:22:17,900 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-4) WFLYJCA0010: Unbound data source [java:jboss/datasources/MySqlDs] 23:22:17,902 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) WFLYJCA0019: Stopped Driver service with driver-name = mysql 23:22:17,942 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) WFLYSRV0028: Stopped deployment mysql (runtime-name: mysql) in 69ms 23:22:17,950 INFO [org.jboss.as.server.deployment] (MSC service thread 1-8) WFLYSRV0027: Starting deployment of "mysql" (runtime-name: "mysql") 23:22:18,663 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-3) WFLYJCA0005: Deploying non-JDBC-compliant driver class com.mysql.cj.jdbc.Driver (version 8.0) 23:22:18,666 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-2) WFLYJCA0018: Started Driver service with driver-name = mysql 23:22:18,668 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-7) WFLYJCA0001: Bound data source [java:jboss/datasources/MySqlDs] 23:22:18,723 INFO [org.jboss.as.server] (management-handler-thread - 2) WFLYSRV0016: Replaced deployment "mysql" with deployment "mysql" 23:22:19,020 INFO [org.jboss.as.repository] (management-handler-thread - 1) WFLYDR0001: Content added at location /path/to/wildfly-29.0.1.Final/standalone/data/content/76/ef6010e68f897ce420482ee57720c1c2236aaa/content 23:22:19,023 INFO [org.jboss.as.server.deployment] (MSC service thread 1-7) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war") 23:22:19,342 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) WFLYWELD0003: Processing weld deployment ROOT.war 23:22:19,435 INFO [org.hibernate.validator.internal.util.Version] (MSC service thread 1-7) HV000001: Hibernate Validator 8.0.0.Final 23:22:19,848 INFO [org.jboss.weld.Version] (MSC service thread 1-2) WELD-000900: 5.1.1 (SP1) 23:22:21,759 INFO [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 20) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class org.littlewings.wildfly.datasource.JaxrsActivator 23:22:21,806 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 20) WFLYUT0021: Registered web context: '/' for server 'default-server' 23:22:21,864 INFO [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")
確認。
$ curl localhost:8080/hello 2023-09-26 23:24:11
OKですね。
Mavenプロファイルを分ける
とりあえずやりたいことはできましたが、個人的にはJDBCドライバをWildFlyにデプロイしたいがためにdependencies
に含まれて
いるのは微妙です。
また、毎回JDBCドライバのデプロイとDataSourceの作成をpackage
を実行する度に行うのもなんなので、プロファイルを分けて
おきました。
<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> </build> <profiles> <profile> <id>wildfly</id> <activation> <activeByDefault>false</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <executions> <execution> <id>deploy-artifact</id> <phase>package</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <name>mysql</name> </configuration> </execution> <execution> <id>add-datasource</id> <phase>package</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <address>subsystem=datasources,data-source=MySqlDs</address> <resources> <resource> <properties> <jndi-name>java:jboss/datasources/MySqlDs</jndi-name> <enabled>true</enabled> <connection-url><![CDATA[jdbc:mysql://172.17.0.3:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin]]></connection-url> <driver-name>mysql</driver-name> <user-name>kazuhira</user-name> <password>password</password> </properties> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
なんとなく、こちらのパターンではwildfly:deploy
は外しておきました。
これで、プロファイルを指定するとJDBCドライバのデプロイとDataSourceの作成が行えます。
$ mvn -Pwildfly package
アプリケーションのデプロイは、こちらで。
$ mvn -Pwildfly wildfly:deploy
また、リモートのWildFlyに操作を行いたい場合は、WildFlyにユーザーを作成した上でその内容をconfiguration
に設定すればOKです。
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <configuration> <hostname>172.17.0.2</hostname> <username>wildfly-admin</username> <password>password</password> </configuration> <executions> <execution> <id>deploy-artifact</id> <phase>package</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <name>mysql</name> </configuration> </execution> <execution> <id>add-datasource</id> <phase>package</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <address>subsystem=datasources,data-source=MySqlDs</address> <resources> <resource> <properties> <jndi-name>java:jboss/datasources/MySqlDs</jndi-name> <enabled>true</enabled> <connection-url><![CDATA[jdbc:mysql://172.17.0.3:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin]]></connection-url> <driver-name>mysql</driver-name> <user-name>kazuhira</user-name> <password>password</password> </properties> </resource> </resources> </configuration> </execution> </executions> </plugin>
この部分ですね。
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <configuration> <hostname>172.17.0.2</hostname> <username>wildfly-admin</username> <password>password</password> </configuration>
あ、でもこの方法だとWARファイルにMySQLのJDBCドライバが含まれてしまいますね。
こんな感じにJDBCドライバのデプロイおよびDataSourceの作成と、デプロイでプロファイルを分けた方がいいでしょうか。
<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> <pluginManagement> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>4.2.0.Final</version> <!-- 共通の設定があればここに書く <configuration> <hostname>172.17.0.2</hostname> <username>wildfly-admin</username> <password>password</password> </configuration> --> </plugin> </plugins> </pluginManagement> </build> <profiles> <profile> <id>setup</id> <activation> <activeByDefault>false</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <executions> <execution> <id>deploy-artifact</id> <phase>package</phase> <goals> <goal>deploy-artifact</goal> </goals> <configuration> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <name>mysql</name> </configuration> </execution> <execution> <id>add-datasource</id> <phase>package</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <address>subsystem=datasources,data-source=MySqlDs</address> <resources> <resource> <properties> <jndi-name>java:jboss/datasources/MySqlDs</jndi-name> <enabled>true</enabled> <connection-url><![CDATA[jdbc:mysql://172.17.0.3:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin]]></connection-url> <driver-name>mysql</driver-name> <user-name>kazuhira</user-name> <password>password</password> </properties> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>deploy</id> <activation> <activeByDefault>false</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> </plugin> </plugins> </build> </profile> </profiles>
## JDBCドライバのデプロイおよびDataSourceの作成 $ mvn -Psetup package ## アプリケーションのデプロイ $ mvn -Pdeploy wildfly:deploy
試行パターンは、こんな感じで。
他にもコマンドを実行したいなどあれば、こちらを使えばOKです。
WildFly Maven Plugin – wildfly:execute-commands
複数回コマンドを実行した時に、うまくいくとは限りませんが…。
なお、JDBCドライバのデプロイとDataSourceの作成は繰り返し実行しても問題ありません。
おわりに
WildFly Maven Pluginで、JDBCドライバのデプロイとデータソースの作成を行ってみました。
最初、JDBCドライバのバージョンをどこで指定すればいいのかわからなかったりしたのですが、サンプルをずっと見ていると最後の方に
ヒントがあったので、それで気づいたりしました。
ところで、覚えたはいいんですけど、この方法って使うんでしょうかね?
特にコンテナ環境などだと、なんとなくGalleonでプロビジョニングした方がいいのかな、と思ったりもするのですが。