かんがるーさんの日記

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

Gradle で Multi-project を作成する ( その3 )( lib+cmdapp編、Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する )

概要

記事一覧はこちらです。

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

  • 今回の手順で確認できるのは以下の内容です。
    • Gradle で Spring を使用しないライブラリ+Spring Boot ベースのコマンドラインアプリケーションの Multi-project を作成します。
    • 今回は Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成して Multi-project を完成させます。

参照したサイト・書籍

目次

  1. Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する
    1. IntelliJ IDEA で sample-cmdapp プロジェクトを作成する
    2. .gitignore に設定を追加する
    3. sample-cmdapp プロジェクトから不要なファイルを削除する
    4. settings.gradle に sample-cmdapp プロジェクトの include 文を追加する
    5. sample-cmdapp プロジェクトの build.gradle から不要な記述を削除し、sample-lib プロジェクトへの依存関係を追加する
    6. SampleCmdappApplication クラスに CommandLineRunner インターフェースを実装する
  2. clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
  3. java -jar sample-cmdapp-1.0.0-RELEASE.jar コマンドを実行してみる
  4. まとめ

手順

Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する

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

IntelliJ IDEA から Spring Initializr を利用して Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成します。

f:id:ksby:20190420084840p:plain f:id:ksby:20190420085057p:plain f:id:ksby:20190420085206p:plain ※シンプルなコマンドアプリケーションなので何もチェックしません。

f:id:ksby:20190420085319p:plain

作成後 IntelliJ IDEA のウィンドウが開きますが、何もせずに閉じます。

.gitignore に設定を追加する

sample-cmdapp プロジェクトの下に作成された .gitignore から ### STS ###### IntelliJ IDEA ###### NetBeans ###### VS Code ### の設定をコピーして、ルートディレクトリの .gitignore に追加します。

# Ignore Gradle project-specific cache directory
.gradle

# Ignore Gradle build output directory
build

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

sample-cmdapp プロジェクトから不要なファイルを削除する

D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp\sample-cmdapp\ の下には以下のディレクトリ・ファイルがありますが、

f:id:ksby:20190420085717p:plain

src ディレクトリと build.gradle 以外は不要なので削除します。削除すると以下の状態になります。

f:id:ksby:20190420090738p:plain

settings.gradle に sample-cmdapp プロジェクトの include 文を追加する

D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp の下の settings.gradle に include 'sample-cmdapp' を追加します。

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

追加後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると :sample-cmdapp が追加されます。

f:id:ksby:20190420091403p:plain

sample-cmdapp プロジェクトの build.gradle から不要な記述を削除し、sample-lib プロジェクトへの依存関係を追加する

sample-cmdapp プロジェクトの build.gradle を以下の内容に変更します。

plugins {
    id "org.springframework.boot" version "2.1.4.RELEASE"
}

dependencyManagement {
    imports {
        mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
    }
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    testImplementation("org.springframework.boot:spring-boot-starter-test")

    implementation project(":sample-lib")
}

sample-cmdapp の設定はプロジェクトのルートディレクトリにある build.gradle に project(':sample-cmdapp') { ... } で記述することも可能ですが、その場合 plugins { ... } が使えなくなるので sample-cmdapp の下に build.gradle を残してこの中に設定を記述することにします。

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

SampleCmdappApplication クラスに CommandLineRunner インターフェースを実装する

sample-cmdapp/src/main/java/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplication.java を以下のように変更します。

package ksbysample.cmdapp.samplecmdapp;

import ksbysample.lib.samplelib.StrNumUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SampleCmdappApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(SampleCmdappApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("★★★ " + StrNumUtils.plus("1", "2"));
    }

}

クラスに implements CommandLineRunner を追加し run メソッドを実装します。run メソッド内で sample-lib プロジェクトの StrNumUtils クラスを呼び出すようにします。

次にテストクラスを作成します。Spring Initializr でプロジェクトを作成したので sample-cmdapp/src/test/java/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplicationTests.java が作成されていますが、このテストはファイル毎削除して Spock で作り直します。

f:id:ksby:20190420093746p:plain f:id:ksby:20190420093816p:plain

cmdapp/src/test/groovy/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplicationTest.groovy が新規作成されますので、以下の内容を記述します。

package ksbysample.cmdapp.samplecmdapp

import spock.lang.Specification

class SampleCmdappApplicationTest extends Specification {

    def "sample-cmdapp を実行すると'★★★ 3'が出力される"() {
        setup:
        def buf = new ByteArrayOutputStream(1024)
        System.out = new PrintStream(buf)

        when:
        SampleCmdappApplication.main()

        then:
        buf.toString().contains("★★★ 3")
    }

}

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

f:id:ksby:20190420101420p:plain

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

clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと、BUILD SUCCESSFUL のメッセージが出力されました。

f:id:ksby:20190420094611p:plain

各プロジェクトの build/libs ディレクトリの下に sample-cmdapp-1.0.0-RELEASE.jar、sample-lib-1.0.0-RELEASE.jar が作成されています。

f:id:ksby:20190420101620p:plain

sample-cmdapp-1.0.0-RELEASE.jar を zip ソフトで開いてみると BOOT-INF/lib の下に sample-lib-1.0.0-RELEASE.jar が入っていることも確認できます。

f:id:ksby:20190420101947p:plain

java -jar sample-cmdapp-1.0.0-RELEASE.jar コマンドを実行してみる

Multi-project で作成した sample-cmdapp-1.0.0-RELEASE.jar が問題なく動作することをコマンドラインから確認してみます。

コマンドラインから java -jar sample-cmdapp-1.0.0-RELEASE.jar コマンドを実行すると "★★★ 3" が出力されることが確認できました。

f:id:ksby:20190420102448p:plain

まとめ

  • Multi-project ではルートディレクトリの build.gradle の subprojects { ... } に共通の設定を記述する。plugin の設定だけ plugins { ... } が使えないので apply plugin: "..." で記述すること。
  • Spring を使用しないライブラリのサブプロジェクトを作成したい時はサブプロジェクトのディレクトリを作成した後、settings.gradle に include '<サブプロジェクトのディレクトリ名>' を書いてから IntelliJ IDEA の Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すればよい(おそらくコマンドだと gradle wrapper だと思われる)。
  • Spring Boot ベースのコマンドラインアプリケーションのサブプロジェクトを作成したい時は Spring Initializr でサブプロジェクトを作成してから src, build.gradle 以外を削除し、settings.gradle に include '<サブプロジェクトのディレクトリ名>' を書いてから IntelliJ IDEA の Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すればよい。
  • サブプロジェクトの build.gradle の設定はサブプロジェクトのディレクトリの下に build.gradle を置いてその中に記述するか、ルートディレクトリの build.gradle に project(':<サブプロジェクトのディレクトリ名>') { ... } の形式で記述する。

Multi-project を初めて作ってみましたが、Gradle Guides の Creating Multi-project Builds に基本は書かれているので、これを読めば何とか作れるものですね。

履歴

2019/04/20
初版発行。