かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Gradle で Multi-project を作成する ( その2 )( lib+cmdapp編、Multi-project の設定ファイルと Spring を使用しないライブラリのプロジェクトを作成する )

概要

記事一覧はこちらです。

Gradle で Multi-project を作成する ( その1 )( 概要 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Gradle で Spring を使用しないライブラリ+Spring Boot ベースのコマンドラインアプリケーションの Multi-project を作成します。
    • 2回に分けて書きます。
    • 今回は Multi-project のための各種設定ファイルとSpring を使用しないライブラリのプロジェクトを作成します。

参照したサイト・書籍

  1. Gradle Guides - Creating Multi-project Builds
    https://guides.gradle.org/creating-multi-project-builds/

  2. The Gradle Wrapper
    https://docs.gradle.org/5.0/userguide/gradle_wrapper.html#sec:wrapper_generation

  3. Authoring Multi-Project Builds
    https://docs.gradle.org/current/userguide/multi_project_builds.html

目次

  1. 方針
  2. gradle-multiprj-lib-cmdapp ディレクトリを作成する
  3. Spring Initializr で作成したプロジェクトから Gradle Wrapper のファイルをコピーする
  4. Gradle を最新バージョンにする
  5. gradlew init を実行する
  6. build.gradle に subproject 共通の設定を追加する
  7. Spring を使用しないライブラリのプロジェクトを作成する
    1. sample-lib ディレクトリを作成する
    2. settings.gradle に sample-lib プロジェクトの include 文を追加する
  8. IntelliJ IDEA で gradle-multiprj-lib-cmdapp プロジェクトをオープンする
  9. Project SDK を JDK 11 に設定する
  10. StrNumUtils クラスを追加する
  11. clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
  12. 続く。。。

手順

方針

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 ディレクトリを作成します。

f:id:ksby:20190418224918p:plain

Spring Initializr で作成したプロジェクトから Gradle Wrapper のファイルをコピーする

IntelliJ IDEA で Spring Initializr の新規 Gradle プロジェクトを作成します。

f:id:ksby:20190418225523p:plain

ここから以下のディレクトリ・ファイルを D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp の下にコピーします。

f:id:ksby:20190418225827p:plain

Gradle を最新バージョンにする

コピーした gradle/wrapper/gradle-wrapper.properties を見ると Gradle のバージョンは 5.2.1 だったのですが、https://gradle.org/releases/ を見ると Gradle の最新バージョンは 5.4 なので 5.4 にバージョンアップします。

コマンドプロンプトから gradlew wrapper --gradle-version=5.4gradlew --versiongradlew wrapper コマンドを実行します。

f:id:ksby:20190420003041p:plain

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: basic1: groovy を選択し、Project name は何も入力せずに Enter キーを押します。

f:id:ksby:20190418231310p:plain

gradle-multiprj-lib-cmdapp ディレクトリの下は以下のようになり、

f:id:ksby:20190418231535p:plain

生成された .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 プロジェクトを以下の画像の手順でオープンします。

f:id:ksby:20190420073950p:plain f:id:ksby:20190420074054p:plain f:id:ksby:20190420074246p:plain

IntelliJ IDEA のメイン画面が表示されると Project Tool Window には以下のように表示されます。

f:id:ksby:20190420074626p:plain

Gradle Tool Window は以下のように表示されます。

f:id:ksby:20190420074748p:plain

Project SDKJDK 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」ボタンをクリックします。

f:id:ksby:20190419072755p:plain

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 で作成します。

f:id:ksby:20190420075427p:plain f:id:ksby:20190420075505p:plain

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");
    }

}

ここまでで以下のディレクトリ構成になります。

f:id:ksby:20190420080105p:plain

clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う

build タスクが正常に終了するか確認します。clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと、BUILD SUCCESSFUL のメッセージが出力されました。

f:id:ksby:20190420081113p:plain

sample-lib ディレクトリの下に build, out ディレクトリが作成されており、sample-lib/build/libs の下に sample-lib-1.0.0-RELEASE.jar が出力されていました。

f:id:ksby:20190420081359p:plain

ここまでは問題なさそうです。

続く。。。

次回は Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成して Multi-project を完成させます。

履歴

2019/04/20
初版発行。