Spring Boot で Gradle を使う

今までMaven使っていたのですが、今年からはGradleに挑戦してみようと思います。設定ファイルでなくソースコードなのでエラーが詳細に出るらしく、Java以外の言語でも使用されているので情報量も多い点から、扱いやすいと考えたからです。

Mavenには大変お世話になったのですが、長く使ってても使いこなせてる感じがありません。その原因はエラー出力されてもどこのことか分かりにくかったり、細かな挙動がラップされててブラックボックスになっていたり、記述が冗長で時間かかるからかと思います。これらがGradleでは解決されることを期待しています。

インストール

私が使用している Pleiades リリース 2020-12 Java Full Edition には最初からGradleがインストールされていました。Gradleは内部的にJavaを使用するそうで、Javaのディレクトリを設定する必要があります。(しかし、Javaディレクトリを設定しないでもGradleを使用することができました)

プロジェクトの作成

Spring Starter Projectでプロジェクトを作成します。Spring BootでGradleを使用するには、プロジェクトの新規作成画面のTypeでGradleを設定します。

Gradleを設定してSpring Bootプロジェクトを作成すると、自動でディレクトリが構成されます。その中の build.gradle というファイルがGradleのビルドスクリプトを記述するファイルです。

今回はビルド・実行の確認用にSampleController.javaとindex.htmlを追加しました。

Gradleスクリプトの記述について

作成されたbuild.gradleは次のようになっています。

build.gradle
plugins {
	id 'org.springframework.boot' version '2.4.1'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

plugins や configurations がラベルとして予約されており、各種の設定情報を記述します。repositories や dependencies はMavenでも見慣れた設定項目ですね。

Gradleでは taskラベルを使用してオリジナルの定義をすることもできます。taskラベルでは doFirst、doLastを記述することでタスクの一番最初に実行する処理、一番最後に実行する処理を定義することが出来ます。

task タスク名 {
  doFirst {
    一番最初に行う処理
  }

  doLast {
    一番最後に行う処理
  }
}

taskラベルはコマンドプロンプトで次のように実行できます。(eclipseではどのように実行するのだろうか)

gradle タスク名

taskの依存関係は次のように表します。

task タスク1 {
  処理
}

task タスク2 (dependsOn:'タスク1') {
  処理
}

プロジェクトの実行

eclipse の Run As > Spring Boot App でプロジェクトを実行します。

プロジェクトがエラーなく実行されて、ブラウザに確認用に設定した表示が出力されました。

今回確認用に使用したソースコードは次のとおりです。

SampleController.java
package com.example.demo;

import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SampleController {

  @GetMapping(value = "/")
  public String sampleHostGet(Model model) {
    System.out.println(" sampleHostGet ");
    model.addAttribute("serverTime", new Date());
    return "index";
  }

}

index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <p th:text="${serverTime}">The time on the server is ${serverTime}.</p>
  </body>
</html>

まとめ

Spring BootでGradleを使ってみました。Mavenのほうが慣れていますが、Gradleのほうが明らかに読みやすいと感じました。

また、ファイルIOが少ないからかGradleのほうがビルドにかかる時間が明らかに少ないと感じました。積み重なると大きな時間になりますので、高速で開発するにはGradleのほうが良いでしょう。

今回はGradleが柔軟である点については感じませんでしたが今後使用していくうちに認識できればと思います。そして、チームがMavenを使用しようとしていたら、説得力をもってGradleを使用するよう提案できるように準備します。

参考

Gradle User Manual – Gradle

Gradle 日本語ドキュメント

Spring Boot Gradle Plugin Reference Guide – Spring Boot