Gradle で Multi-project を作成する ( その7 )( doma2lib+cmdapp+webapp編、Multi-project の設定ファイルと docker-compose.yml を作成する )
概要
記事一覧はこちらです。
Gradle で Multi-project を作成する ( その6 )( Multi-project は settings.gradle に include を書くだけでもよいのでは? ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
dockerhub - mysql https://hub.docker.com/_/mysql
dockerhub - adminer https://hub.docker.com/_/adminer/
MySQL8.0ではGRANT構文でユーザを作成できない
https://www7390uo.sakura.ne.jp/wordpress/archives/456MySQL Innovation Day Tokyo で MySQL 8 の文字コードについて話した
https://tmtms.hatenablog.com/entry/201805/mysql-innovation-day-tokyoユーザーを作成する(CREATE USER文)
https://www.dbonline.jp/mysql/user/index1.htmlMySQL 8.0 の AUTO_INCREMENT について
https://www.s-style.co.jp/blog/2018/08/2284/【MySQL入門】CREATE TABLE文でテーブルを作成する方法
https://www.sejuku.net/blog/82708MySQL data types
http://zetcode.com/databases/mysqltutorial/datatypes/
目次
- 方針
- gradle-multiprj-doma2lib-cmdwebapp ディレクトリ作成+Gradle Wrapper コピー+Gradle 5.4.1 バージョンアップ+
gradlew init
- IntelliJ IDEA で gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンする
- Spring Initializr で doma2-lib プロジェクトを作成する
- MySQL と Flyway を起動するための docmer-compose.yml を作成した後、サーバを起動してデータベースとテーブルを作成する
手順
方針
gradle-multiprj-doma2lib-cmdwebapp ├ doma2-lib <-- Doma 2 の Entity、Dao を提供するライブラリの Project │ ├ src │ │ ├ main │ │ │ └ java │ │ │ └ ksbysample │ │ │ └ lib │ │ │ └ doma2lib │ │ │ ├ dao │ │ │ └ entity │ │ └ resources │ │ ├ db │ │ │ ├ init │ │ │ │ └ create_database.sql │ │ │ └ migration │ │ │ └ V1__create_table.sql <-- Flyway 用 SQL ファイル │ │ ├ db-develop.properties <-- develop profile 用 DB 設定ファイル │ │ └ db-product.properties <-- product profile 用 DB 設定ファイル │ └ build.gradle ├ sample-cmdapp <-- Spring Boot ベースのコマンドラインアプリケーションの Project │ ├ src │ │ ├ main │ │ │ └ java │ │ │ └ ksbysample │ │ │ └ app │ │ │ └ samplecmdapp │ │ └ resources │ └ build.gradle ├ sample-webapp <-- Spring Boot ベースの Web アプリケーションの Project │ ├ src │ │ ├ main │ │ │ └ java │ │ │ └ ksbysample │ │ │ └ app │ │ │ └ samplewebapp │ │ └ resources │ └ build.gradle ├ build.gradle └ settings.gradle
- 今回は全てのプロジェクトを Spring Initializr で作成します。
- develop と product の2つの Profile を作成・使用します。
- テスティングフレームワークは全ての Project で JUnit 5 と Spock を使用できるようにします。
- checkstyle, spotbugs, pmd, error-prone は導入しません。
- Spring Boot ベースの Web アプリケーションでは 8080番ポートを使用します。
- Spring Boot ベースのアプリケーションの build.gradle の共通の設定は各サブプロジェクトの build.gradle ではなく gradle-multiprj-doma2lib-cmdwebapp の build.gradle に記述します。
- DB は MySQL のバージョン 8 を docker-compose で起動して利用します(これまで使ったことがなかったので)。
- DB へのデータ投入には Flyway を使用します。Flyway に必要なファイルは doma2-lib プロジェクトの下に配置します。
- コマンドラインアプリケーションでは CSV ファイルを読み込んで DB のテーブルにデータを登録し、Web アプリケーションでは DB のテーブルに登録されたデータを取得して表示します。
- 最初に doma2-lib-1.0.0-RELEASE.jar を sample-cmdapp-1.0.0-RELEASE.jar、sample-webapp-1.0.0-RELEASE.jar の中に入れる方式(JarLauncher による起動)で一通り書いてから、doma2-lib-1.0.0-RELEASE.jar を外に出す方式(PropertiesLauncher による起動)を書くつもりです。
- draw.io で全体図を描いてみました。
gradle-multiprj-doma2lib-cmdwebapp ディレクトリ作成+Gradle Wrapper コピー+Gradle 5.4.1 バージョンアップ+gradlew init
ksby/ksbysample-boot-miscellaneous の repository を checkout している D:\project-springboot\ksbysample-boot-miscellaneous
の下に gradle-multiprj-doma2lib-cmdwebapp ディレクトリを作成します。
gradle-multiprj-lib-webapp2 プロジェクトから Gradle Wrapper のファイルをコピーします。
- gradle ディレクトリ
- gradlew
- gradlew.bat
コマンドプロンプトから gradlew wrapper --gradle-version=5.4.1
、gradlew --version
、gradlew wrapper
コマンドを実行して Gradle を 5.4 → 5.4.1 へバージョンアップします。
gradle/wrapper/gradle-wrapper.properties を見ると 5.4.1 になっています。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
gradlew init
コマンドを実行します。選択肢は 1: basic
、1: groovy
を選択し、Project name は何も入力せずに Enter キーを押します。
IntelliJ IDEA で gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンする
gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンします。


Spring Initializr で doma2-lib プロジェクトを作成する
Flyway で使用する SQL ファイルを doma2-lib プロジェクトの下に配置するので、最初に IntelliJ IDEA から Spring Initializr を利用して doma2-lib プロジェクトを作成しておきます。




※dependencies のダイアログでは何もチェックしません。
作成後 IntelliJ IDEA のウィンドウが開きますが、何もせずに閉じます。
src ディレクトリと build.gradle だけ残して、それ以外のディレクトリファイルは全て削除します。gradle-multiprj-doma2lib-cmdwebapp プロジェクトの settings.gradle にはまだ include 文は追加しません。
MySQL と Flyway を起動するための docmer-compose.yml を作成した後、サーバを起動してデータベースとテーブルを作成する
MySQL のデータファイルをローカルディレクトリに保存するために docker/mysql/data を作成します。
doma2-lib/src/main/resources の下に db/init、db/migration の2つのディレクトリを作成します。
doma2-lib/src/main/resources/db/init の下に create_database.sql を新規作成し、以下の内容を記述します。
create database if not exists sampledb character set utf8mb4 collate utf8mb4_ja_0900_as_cs_ks; create user 'sampledb_user'@'%' identified by 'xxxxxxxx'; grant all privileges ON sampledb.* to 'sampledb_user'@'%' with grant option; flush privileges;
doma2-lib/src/main/resources/db/migration の下に V1__create_table.sql を新規作成し、以下の内容を記述します。
create table employee ( id int(11) not null auto_increment, name varchar(128) not null, age int(3) not null, sex enum('男', '女'), update_time datetime default current_timestamp, primary key (id) ); insert into employee (name, age, sex) values ('田中 太郎', 20, '男'); insert into employee (name, age, sex) values ('鈴木 花子', 18, '女');
ルートディレクトリの下に .env を新規作成し、以下の内容を記述します。
MYSQL_VERSION=8.0.16 ADMINER_VERSION=4.7.1 FLYWAY_VERSION=5.2.4 FLYWAY_URL=jdbc:mysql://mysql/sampledb FLYWAY_USER=sampledb_user FLYWAY_PASSWORD=xxxxxxxx
ルートディレクトリの下に docker-compose.yml を新規作成し、以下の内容を記述します。
version: '3' services: # 起動したコンテナに /bin/sh でアクセスする場合には以下のコマンドを実行する # docker exec -it mysql bash mysql: image: mysql:${MYSQL_VERSION} container_name: mysql command: --default-authentication-plugin=mysql_native_password restart: always ports: - 3306:3306 environment: - TZ=Asia/Tokyo - MYSQL_ROOT_PASSWORD=xxxxxxxx volumes: - ./docker/mysql/data:/var/lib/mysql - ./doma2-lib/src/main/resources/db/init/create_database.sql:/docker-entrypoint-initdb.d/create_database.sql # URL # http://localhost:9080/ adminer: image: adminer:${ADMINER_VERSION} container_name: adminer restart: always ports: - 9080:8080 environment: - TZ=Asia/Tokyo - ADMINER_DEFAULT_SERVER=mysql flyway: image: boxfuse/flyway:${FLYWAY_VERSION}-alpine container_name: flyway environment: - TZ=Asia/Tokyo volumes: - ./doma2-lib/src/main/resources/db/migration:/flyway/sql command: -url=${FLYWAY_URL} -user=${FLYWAY_USER} -password=${FLYWAY_PASSWORD} -connectRetries=60 migrate depends_on: - mysql # 下の3行は debug 用 # うまく動かない時はコメントアウトを解除した後、 # docker exec -it flyway /bin/sh # で接続してから # flyway <command に記述した文字列> # を実行してみる # # entrypoint: /bin/sh # stdin_open: true # tty: true
これで必要なファイルを一通り作成しましたので、コマンドラインから docker-compose up -d
コマンドを実行します。
http://localhost:9080/ にアクセスして sampledb が作成されていること、emplayee テーブルにデータが登録されていることを確認します。
履歴
2019/04/29
初版発行。
2019/04/30
* 「参照したサイト・書籍」に MySQL data types を追加した。
* V1__create_table.sql の create table employee 文に age, sex, update_time のカラムを追加し、投入するデータを日本語のものに変更した。
* create database の collate を utf8mb4_0900_as_cs → utf8mb4_ja_0900_as_cs_ks に変更した。