Skip to content

Gradle詳細

Gradleは、GroovyまたはKotlin DSLを使用する柔軟なビルドツールです。この章では、Gradleの詳細な使い方と実践的な設定方法について解説します。

my-project/
├── build.gradle # ビルドスクリプト(Groovy DSL)
├── build.gradle.kts # ビルドスクリプト(Kotlin DSL)
├── settings.gradle # プロジェクト設定
├── gradle.properties # Gradleプロパティ
├── gradle/
│ └── wrapper/ # Gradle Wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── src/
├── main/
│ ├── java/
│ └── resources/
└── test/
├── java/
└── resources/
// プラグインの適用
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
}
// プロジェクト情報
group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'
targetCompatibility = '17'
// リポジトリの設定
repositories {
mavenCentral() // Maven Centralリポジトリ
maven { url 'https://repo.spring.io/milestone' } // Springリポジトリ
mavenLocal() // ローカルMavenリポジトリ
}
// 依存関係の定義
dependencies {
// 実装依存関係(コンパイル時と実行時に必要)
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.postgresql:postgresql'
// 開発時のみ必要な依存関係
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// テスト時にのみ必要な依存関係
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
// コンパイル時のみ必要な依存関係
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// 実行時のみ必要な依存関係
runtimeOnly 'com.h2database:h2'
}
// テスト設定
test {
useJUnitPlatform()
testLogging {
events 'passed', 'skipped', 'failed'
}
}
// カスタムタスク
task hello {
doLast {
println 'Hello, Gradle!'
}
}
// プラグインの適用
plugins {
java
id("org.springframework.boot") version "3.1.0"
id("io.spring.dependency-management") version "1.1.0"
}
// プロジェクト情報
group = "com.example"
version = "1.0.0"
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
// リポジトリの設定
repositories {
mavenCentral()
maven {
url = uri("https://repo.spring.io/milestone")
}
mavenLocal()
}
// 依存関係の定義
dependencies {
// 実装依存関係
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.postgresql:postgresql")
// 開発時のみ
developmentOnly("org.springframework.boot:spring-boot-devtools")
// テスト時のみ
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
// コンパイル時のみ
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
// 実行時のみ
runtimeOnly("com.h2database:h2")
}
// テスト設定
tasks.test {
useJUnitPlatform()
testLogging {
events("passed", "skipped", "failed")
}
}
// カスタムタスク
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}
dependencies {
// implementation: コンパイル時と実行時に必要(推奨)
implementation 'org.springframework.boot:spring-boot-starter-web'
// api: implementationと同様だが、依存関係が公開される(ライブラリ開発時)
api 'com.example:my-library:1.0.0'
// compileOnly: コンパイル時のみ必要(実行時は提供される)
compileOnly 'org.projectlombok:lombok'
// runtimeOnly: 実行時のみ必要
runtimeOnly 'com.h2database:h2'
// testImplementation: テスト時にのみ必要
testImplementation 'junit:junit:4.13.2'
// testRuntimeOnly: テスト実行時のみ必要
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
// developmentOnly: 開発時のみ必要
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
// 1. 直接指定
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.1.0'
}
// 2. 変数を使用
ext {
springBootVersion = '3.1.0'
junitVersion = '5.9.2'
}
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}"
}
// 3. gradle.propertiesを使用
// gradle.properties
springBootVersion=3.1.0
junitVersion=5.9.2
// build.gradle
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
testImplementation "org.junit.jupiter:junit-jupiter:$junitVersion"
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web') {
// 特定の依存関係を除外
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
// 複数の依存関係を除外
implementation('com.example:my-library:1.0.0') {
exclude group: 'org.slf4j'
exclude group: 'log4j', module: 'log4j'
}
// すべての推移的依存関係から特定のモジュールを除外
configurations.all {
exclude group: 'commons-logging', module: 'commons-logging'
}
}
// シンプルなタスク
task hello {
doLast {
println 'Hello, Gradle!'
}
}
// タスクの依存関係
task compile {
doLast {
println 'Compiling...'
}
}
task test {
dependsOn compile // compileタスクの後に実行
doLast {
println 'Testing...'
}
}
// 条件付きタスク
task build {
doLast {
if (project.hasProperty('skipTests')) {
println 'Skipping tests'
} else {
println 'Running tests'
}
}
}
// ファイル操作タスク
task copyResources(type: Copy) {
from 'src/main/resources'
into 'build/resources'
include '**/*.properties'
exclude '**/*.tmp'
}
// アーカイブ作成タスク
task createJar(type: Jar) {
archiveBaseName = 'my-app'
from sourceSets.main.output
manifest {
attributes 'Main-Class': 'com.example.MyApp'
}
}
// カスタムタスククラス
class MyCustomTask extends DefaultTask {
@TaskAction
void execute() {
println "Executing custom task"
}
}
task customTask(type: MyCustomTask) {
// カスタムタスクの設定
}
settings.gradle
rootProject.name = 'my-multi-project'
include 'core'
include 'web'
include 'api'
project(':core').projectDir = file('modules/core')
project(':web').projectDir = file('modules/web')
project(':api').projectDir = file('modules/api')
// ルートプロジェクトのbuild.gradle
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'java'
sourceCompatibility = '17'
targetCompatibility = '17'
dependencies {
testImplementation 'junit:junit:4.13.2'
}
}
// 特定のサブプロジェクトのみに適用
project(':web') {
dependencies {
implementation project(':core')
implementation 'org.springframework.boot:spring-boot-starter-web'
}
}
modules/core/build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
// modules/web/build.gradle
dependencies {
implementation project(':core') // 他のサブプロジェクトに依存
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Terminal window
# Wrapperを生成
gradle wrapper --gradle-version 8.0
# 生成されるファイル
# gradle/wrapper/gradle-wrapper.jar
# gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Terminal window
# Windows
gradlew.bat build
# macOS/Linux
./gradlew build
plugins {
id 'java'
id 'application' // アプリケーション実行用
id 'java-library' // ライブラリ開発用
id 'war' // WARファイル作成用
}
application {
mainClass = 'com.example.MyApp'
}
// プラグインの適用
plugins {
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
// または、buildscriptブロックを使用(古い方法)
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.1.0'
}
}
apply plugin: 'org.springframework.boot'
gradle.properties
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
// タスクの入力と出力を定義することで、インクリメンタルビルドが有効になる
task processResources {
inputs.dir 'src/main/resources'
outputs.dir 'build/resources'
doLast {
copy {
from 'src/main/resources'
into 'build/resources'
}
}
}
build.gradle
def environment = project.hasProperty('env') ? project.env : 'dev'
sourceSets {
main {
resources {
srcDirs "src/main/resources", "src/main/resources-${environment}"
}
}
}
dependencies {
if (environment == 'prod') {
runtimeOnly 'org.postgresql:postgresql'
} else {
runtimeOnly 'com.h2database:h2'
}
}

使用例:

Terminal window
# 開発環境
./gradlew build -Penv=dev
# 本番環境
./gradlew build -Penv=prod
Terminal window
# プロジェクトのビルド
./gradlew build
# クリーンビルド
./gradlew clean build
# テストの実行
./gradlew test
# 特定のタスクの実行
./gradlew hello
# タスクの一覧表示
./gradlew tasks
# 依存関係の表示
./gradlew dependencies
# 依存関係の更新確認
./gradlew dependencyUpdates
# Spring Bootアプリケーションの実行
./gradlew bootRun
# デバッグモードで実行
./gradlew bootRun --debug-jvm
# 並列ビルド
./gradlew build --parallel
# ビルドキャッシュを使用
./gradlew build --build-cache

問題1: 依存関係の解決エラー

// 解決方法: リポジトリを追加
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
// 必要に応じて追加のリポジトリを指定
}

問題2: ビルドが遅い

# gradle.propertiesに追加
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m

問題3: メモリ不足エラー

gradle.properties
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError

Spring BootプロジェクトでのGradle設定例

Section titled “Spring BootプロジェクトでのGradle設定例”
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// Spring Boot Starters
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
// データベース
runtimeOnly 'org.postgresql:postgresql'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// 開発ツール
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// テスト
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
test {
useJUnitPlatform()
testLogging {
events 'passed', 'skipped', 'failed'
exceptionFormat 'full'
}
}
// Spring Bootアプリケーションの実行設定
bootRun {
jvmArgs = ['-Dspring.profiles.active=dev']
}
// JARファイルの設定
jar {
enabled = false // Spring BootのJARを使用するため、標準JARは無効化
}
// カスタムタスク: コードフォーマット
task formatCode(type: Exec) {
commandLine 'prettier', '--write', 'src/**/*.java'
}
// カスタムタスク: コード品質チェック
task checkCodeQuality {
dependsOn test
doLast {
println 'Code quality check completed'
}
}

Gradleの主要な機能:

  • 柔軟なDSL: GroovyまたはKotlin DSLで記述
  • 依存関係管理: 細かいスコープ制御
  • カスタムタスク: 独自のビルドタスクを作成
  • マルチプロジェクト: 大規模プロジェクトの管理
  • Gradle Wrapper: 環境に依存しないビルド
  • プラグインエコシステム: 豊富なプラグイン
  • ビルド最適化: インクリメンタルビルド、並列ビルド

これらの機能を適切に使用することで、効率的なビルドプロセスを構築できます。