かんがるーさんの日記

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

Gradle で Multi-project を作成する ( その6 )( Multi-project は settings.gradle に include を書くだけでもよいのでは? )

概要

記事一覧はこちらです。

Gradle で Multi-project を作成する ( その5 )( lib+webappx2編、Spring Boot ベースの Web アプリケーション(スタブ)のプロジェクトを作成する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • 先に進める前に、Gradle の Multi-project は Gradle の project を1つのディレクトリの下に集めて、親ディレクトリに setting.gradle を作成して、その中に include 文を書けばそれで Multi-project として扱われるのではないだろうか。。。と思ったので試してみます。

参照したサイト・書籍

目次

  1. 2つ Multi-project を作成した上での考察。。。include だけでもいいのでは?
  2. gradle-multiprj-includeonly ディレクトリを作成する
  3. Gradle Wrapper のファイル一式をコピーする
  4. gradlew init コマンドを実行する
  5. IntelliJ IDEA で gradle-multiprj-includeonly プロジェクトを開く
  6. IntelliJ IDEA で sample-lib プロジェクトを新規作成する
  7. setting.gradle に include 'sample-lib' を追加する
  8. sample-lib プロジェクトに StrNumUtils クラスを追加する
  9. IntelliJ IDEA で sample-webapp プロジェクトを新規作成する
  10. setting.gradle に include 'sample-webapp' を追加する
  11. sample-webapp プロジェクトに SampleController クラスを追加する
  12. 動作確認
  13. まとめ

手順

2つ Multi-project を作成した上での考察。。。include だけでもいいのでは?

ここまで2つ Multi-project を作成してみましたが、そこまで凝る必要がなければ setting.gradle に include 文を記述するだけで十分な気がするんですよね。。。

たぶんこんな感じで作っても Multi-project になる気がします。

  • ルートディレクトリの直下に build.gradle を作成してサブプロジェクトの共通の設定を書けば確かに便利だが、実はルートディレクトリ直下には build.gradle はなくてもよい(サブプロジェクト毎に別々に build.gradle があるだけでOK)。
  • ルートディレクトリの下に作成したサブプロジェクトの中のディレクトリ・ファイルはそのままでもよい(何も削除する必要はない)。
  • ルートディレクトリ直下の setting.gradle に include '<サブプロジェクト名>' を記述すれば Multi-project になる。

試してみます。以下のような作り方でも Multi-project になるはずです。

  1. プロジェクトのルートディレクトリを作成する。
  2. Gradle Wrapper のファイル一式をコピーする。
  3. gradlew init コマンドを実行する。
  4. IntelliJ IDEA でプロジェクトを開く。
  5. 後は以下の作業の繰り返し。
    1. IntelliJ IDEA で Gradle プロジェクトか、Spring Boot のプロジェクト(Gradle 版)を作成する。
    2. ルートディレクトリ直下の setting.gradle に include '<サブプロジェクト名>' を記述する。
    3. Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新する。

gradle-multiprj-includeonly ディレクトリを作成する

D:\project-springboot\ksbysample-boot-miscellaneous の下に gradle-multiprj-includeonly ディレクトリを作成します。

f:id:ksby:20190423224300p:plain

Gradle Wrapper のファイル一式をコピーする

gradle-multiprj-lib-webapp2 プロジェクトから Gradle Wrapper のファイル一式をコピーします。

f:id:ksby:20190423224611p:plain

gradlew init コマンドを実行する

コマンドラインから gradlew init コマンドを実行します。

f:id:ksby:20190423224821p:plain

gradle-multiprj-includeonly ディレクトリ内に setting.gradle、build.gradle が作成されて、

f:id:ksby:20190423224912p:plain

setting.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-includeonly'

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/
 */

IntelliJ IDEA で gradle-multiprj-includeonly プロジェクトを開く

IntelliJ IDEA で gradle-multiprj-includeonly プロジェクトを開きます。Project Tool Window と Gradle Tool Window は以下のように表示されます。

f:id:ksby:20190423225829p:plain f:id:ksby:20190423225925p:plain

IntelliJ IDEA で sample-lib プロジェクトを新規作成する

gradle-multiprj-includeonly ディレクトリの下に sample-lib プロジェクトを新規作成します。Gradle プロジェクトとして作成します。

f:id:ksby:20190423230209p:plain f:id:ksby:20190423230330p:plain

ディレクトリ・ファイルは以下のようになります。今回はこのディレクトリの中は何も削除しません(Gradle Wrapper も残したままです)。

f:id:ksby:20190423230522p:plain

setting.gradle に include 'sample-lib' を追加する

setting.gradle に include 'sample-lib' を追加します。

rootProject.name = 'gradle-multiprj-includeonly'
include 'sample-lib'

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、Gradle Tool Window に sample-lib プロジェクトが表示されます。

f:id:ksby:20190423231307p:plain

sample-lib プロジェクトに 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));
    }

}

IntelliJ IDEA で sample-webapp プロジェクトを新規作成する

gradle-multiprj-includeonly ディレクトリの下に sample-webapp プロジェクトを新規作成します。Spring Initializr で作成します。

f:id:ksby:20190424001107p:plain f:id:ksby:20190424001246p:plain f:id:ksby:20190424001356p:plain f:id:ksby:20190424001725p:plain

ディレクトリ・ファイルは以下のようになります。このディレクトリの中は何も削除しません。

f:id:ksby:20190424002027p:plain

setting.gradle に include 'sample-webapp' を追加する

setting.gradle に include 'sample-webapp' を追加します。

rootProject.name = 'gradle-multiprj-includeonly'
include 'sample-lib'
include 'sample-webapp'

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、Gradle Tool Window に sample-webapp プロジェクトが表示されます。

f:id:ksby:20190424002334p:plain

sample-webapp プロジェクトに SampleController クラスを追加する

sample-webapp プロジェクトの build.gradle に sample-lib プロジェクトへの依存関係を追加します。

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'ksby.ksbysample-boot-miscellaneous'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    implementation project(":sample-lib")
}
  • dependencies block に implementation project(":sample-lib") を追加します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

sample-webapp/src/main/java/ksbysample/webapp/samplewebapp/SampleController.java を新規作成して以下の内容を記述します。

package ksbysample.webapp.samplewebapp;

import ksbysample.lib.samplelib.StrNumUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/sample")
public class SampleController {

    @RequestMapping
    @ResponseBody
    public String index() {
        return StrNumUtils.plus("1", "2");
    }

}

動作確認

最初に clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと、BUILD SUCCESSFUL のメッセージが出力されることを確認します。

f:id:ksby:20190424074417p:plain

Run/Debug Configuration に SampleWebappApplication が自動で登録されているので、ここから Tomcat を起動して、

f:id:ksby:20190424074557p:plain f:id:ksby:20190424074735p:plain

http://localhost:8080/sample にアクセスすると 3 と表示されます。

f:id:ksby:20190424074836p:plain

Project Tool Window で見ると以下のディレクトリ構成になっており、sample-lib-1.0-SNAPSHOT.jar、sample-webapp-0.0.1-SNAPSHOT.jar が生成されています。

f:id:ksby:20190424075014p:plain f:id:ksby:20190424075137p:plain

コマンドプロンプトから java -jar sample-webapp-0.0.1-SNAPSHOT.jar コマンドで Tomcat を起動してから、

f:id:ksby:20190424075452p:plain

http://localhost:8080/sample にアクセスしても 3 と表示されます。

f:id:ksby:20190424075540p:plain

まとめ

setting.gradle に include 文を書くだけでも Multi-project とみなされますね。プロジェクトが1つでも最初から Multi-project のディレクトリ・ファイル構成で作っておいて、開発途中にちょっとしたスタブが欲しい時にはサブプロジェクトを作成して setting.gradle に include を追加して対応する、というのもありなのかもしれません。

履歴

2019/04/24
初版発行。