Gradle で Multi-project を作成する ( その2 )( lib+cmdapp編、Multi-project の設定ファイルと Spring を使用しないライブラリのプロジェクトを作成する )
概要
記事一覧はこちらです。
Gradle で Multi-project を作成する ( その1 )( 概要 ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- Gradle で Spring を使用しないライブラリ+Spring Boot ベースのコマンドラインアプリケーションの Multi-project を作成します。
- 2回に分けて書きます。
- 今回は Multi-project のための各種設定ファイルとSpring を使用しないライブラリのプロジェクトを作成します。
参照したサイト・書籍
Gradle Guides - Creating Multi-project Builds
https://guides.gradle.org/creating-multi-project-builds/The Gradle Wrapper
https://docs.gradle.org/5.0/userguide/gradle_wrapper.html#sec:wrapper_generationAuthoring Multi-Project Builds
https://docs.gradle.org/current/userguide/multi_project_builds.html
目次
- 方針
- gradle-multiprj-lib-cmdapp ディレクトリを作成する
- Spring Initializr で作成したプロジェクトから Gradle Wrapper のファイルをコピーする
- Gradle を最新バージョンにする
- gradlew init を実行する
- build.gradle に subproject 共通の設定を追加する
- Spring を使用しないライブラリのプロジェクトを作成する
- IntelliJ IDEA で gradle-multiprj-lib-cmdapp プロジェクトをオープンする
- Project SDK を JDK 11 に設定する
- StrNumUtils クラスを追加する
- clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
- 続く。。。
手順
方針
- 以下のディレクトリ構成の Multi-project を作成します。
gradle-multiprj-lib-cmdapp ├ sample-cmdapp <-- Spring Boot ベースのコマンドラインアプリケーションの Project └ sample-lib <-- Spring を使用しないライブラリの Project
- Spring Boot ベースのコマンドラインアプリケーションの Project では Profile は作成しません。
- テスティングフレームワークは全ての Project で JUnit 5 と Spock を使用できるようにします。
- checkstyle, spotbugs, pmd, error-prone は今回は導入しません。
gradle-multiprj-lib-cmdapp ディレクトリを作成する
ksby/ksbysample-boot-miscellaneous の repository を checkout している D:\project-springboot\ksbysample-boot-miscellaneous
の下に gradle-multiprj-lib-cmdapp ディレクトリを作成します。
Spring Initializr で作成したプロジェクトから Gradle Wrapper のファイルをコピーする
IntelliJ IDEA で Spring Initializr の新規 Gradle プロジェクトを作成します。
ここから以下のディレクトリ・ファイルを D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp
の下にコピーします。
- gradle ディレクトリ
- gradlew
- gradlew.bat
Gradle を最新バージョンにする
コピーした gradle/wrapper/gradle-wrapper.properties を見ると Gradle のバージョンは 5.2.1 だったのですが、https://gradle.org/releases/ を見ると Gradle の最新バージョンは 5.4 なので 5.4 にバージョンアップします。
コマンドプロンプトから gradlew wrapper --gradle-version=5.4
、gradlew --version
、gradlew wrapper
コマンドを実行します。
gradle/wrapper/gradle-wrapper.properties を見ると 5.4 になっています。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
gradlew init を実行する
gradlew init
コマンドを実行します。選択肢は 1: basic
、1: groovy
を選択し、Project name は何も入力せずに Enter キーを押します。
gradle-multiprj-lib-cmdapp ディレクトリの下は以下のようになり、
生成された .gitignore、build.gradle、settings.gradle は以下の内容になっています。
■.gitignore
# Ignore Gradle project-specific cache directory .gradle # Ignore Gradle build output directory build
■build.gradle
/* * This file was generated by the Gradle 'init' task. * * This is a general purpose Gradle build. * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds/ */
■settings.gradle
/* * This file was generated by the Gradle 'init' task. * * The settings file is used to specify which projects to include in your build. * * Detailed information about configuring a multi-project build in Gradle can be found * in the user manual at https://docs.gradle.org/5.4/userguide/multi_project_builds.html */ rootProject.name = 'gradle-multiprj-lib-cmdapp'
build.gradle に subproject 共通の設定を追加する
build.gradle に subproject 共通の設定を追加します。以下の内容に変更します。
buildscript { repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "io.spring.gradle:dependency-management-plugin:1.0.7.RELEASE" } } allprojects { repositories { mavenCentral() } } subprojects { group "ksby.ksbysample-boot-miscellaneous" version "1.0.0-RELEASE" apply plugin: "java" apply plugin: "groovy" apply plugin: "io.spring.dependency-management" sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 [compileJava, compileTestGroovy, compileTestJava]*.options*.encoding = "UTF-8" [compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = ["-Xlint:all,-options,-processing,-path"] dependencyManagement { imports { mavenBom("org.junit:junit-bom:5.4.2") } } dependencies { def assertjVersion = "3.12.2" def spockVersion = "1.3-groovy-2.5" // for Spock testImplementation("org.spockframework:spock-core:${spockVersion}") testImplementation("org.spockframework:spock-spring:${spockVersion}") // for JUnit 5 + AssertJ // junit-jupiter で junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加される testCompile("org.junit.jupiter:junit-jupiter") testRuntime("org.junit.platform:junit-platform-launcher") testImplementation("org.assertj:assertj-core:${assertjVersion}") } def jvmArgsDefault = [ "-ea", "-Dfile.encoding=UTF-8", "-Dsun.nio.cs.map=x-windows-iso2022jp/ISO-2022-JP" ] def jvmArgsAddOpens = [ "--add-opens=java.base/java.io=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.ref=ALL-UNNAMED", "--add-opens=java.base/java.lang.reflect=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" ] def printTestCount = { desc, result -> if (!desc.parent) { // will match the outermost suite println "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" } } task testJUnit4AndSpock(type: Test) { jvmArgs = jvmArgsDefault + jvmArgsAddOpens testLogging { afterSuite printTestCount } } test.dependsOn testJUnit4AndSpock test { jvmArgs = jvmArgsDefault + jvmArgsAddOpens // for JUnit 5 useJUnitPlatform() testLogging { afterSuite printTestCount } } }
subprojects { ... }
内で subproject 共通の Gradle plugin を記述する時にplugins { ... }
は使えません。apply plugin: "..."
で記述します。
Spring を使用しないライブラリのプロジェクトを作成する
sample-lib ディレクトリを作成する
gradle-multiprj-lib-cmdapp ディレクトリの下に sample-lib ディレクトリを作成します。
settings.gradle に sample-lib プロジェクトの include 文を追加する
D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp
の下の settings.gradle に include 'sample-lib'
を追加します。
rootProject.name = 'gradle-multiprj-lib-cmdapp' include 'sample-lib'
IntelliJ IDEA で gradle-multiprj-lib-cmdapp プロジェクトをオープンする
gradle-multiprj-lib-cmdapp プロジェクトを以下の画像の手順でオープンします。
IntelliJ IDEA のメイン画面が表示されると Project Tool Window には以下のように表示されます。
Gradle Tool Window は以下のように表示されます。
Project SDK を JDK 11 に設定する
IntelliJ IDEA のメインメニューから「File」-「Project Structure...」を選択し「Project Structure」ダイアログを表示し「Project SDK」で JDK 11 を、「Project language level」で「SDK default(11 - local variable syntax for lambda parameters)」を選択して「OK」ボタンをクリックします。
StrNumUtils クラスを追加する
sample-lib/src/main/java の下に ksbysample.lib.samplelib パッケージを作成し、その下に StrNumUtils.java を新規作成して以下の内容を記述します。
package ksbysample.lib.samplelib; public class StrNumUtils { public static String plus(String v1, String v2) { return String.valueOf(Integer.parseInt(v1) + Integer.parseInt(v2)); } }
テストクラスも作成します。今回は JUnit 5 で作成します。
src/test/java/ksbysample/lib/samplelib/StrNumUtilsTest.java が新規作成されるので、以下の内容を記述します。
package ksbysample.lib.samplelib; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class StrNumUtilsTest { @Test @DisplayName("plusメソッドのテスト") void plus() { assertThat(StrNumUtils.plus("1", "2")).isEqualTo("3"); } }
ここまでで以下のディレクトリ構成になります。
clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
build タスクが正常に終了するか確認します。clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと、BUILD SUCCESSFUL のメッセージが出力されました。
sample-lib ディレクトリの下に build, out ディレクトリが作成されており、sample-lib/build/libs の下に sample-lib-1.0.0-RELEASE.jar が出力されていました。
ここまでは問題なさそうです。
続く。。。
次回は Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成して Multi-project を完成させます。
履歴
2019/04/20
初版発行。