Gradle

ビルドツールJavaKotlinGroovyDSL高性能インクリメンタルビルド

ビルドツール・パッケージマネージャー

Gradle

概要

Gradleは、Java、Kotlin、Scala、Androidなどのマルチ言語対応のモダンなビルド自動化ツールです。GroovyやKotlinベースのDSL(Domain Specific Language)を使用し、高い柔軟性とパフォーマンスを提供します。インクリメンタルビルド、ビルドキャッシュ、パラレル実行などの高度な機能で、Mavenと比較して2-10倍高速なビルドを実現します。

詳細

アーキテクチャ

Gradleのビルドスクリプトは、タスクの非循環有向グラフ(DAG)としてモデル化され、高度な依存関係管理と柔軟なビルドロジックを可能にします。

主要特徴

  • 高パフォーマンス: インクリメンタルビルド、ビルドキャッシュ、デーモンプロセス
  • 柔軟なDSL: GroovyやKotlinでのスクリプト記述
  • マルチ言語対応: Java、Kotlin、Scala、Groovy、Androidなど
  • 豊富なプラグイン: 扩張可能なエコシステム
  • マルチプロジェクトビルド: 大規模プロジェクトの効率的管理

パフォーマンス最適化

  1. インクリメンタリティ: 入力/出力の追跡で不要な作業を回避
  2. ビルドキャッシュ: 同じ入力のビルド結果を再利用
  3. Gradleデーモン: ビルド情報をメモリに保持し高速化
  4. パラレル実行: 獨立したタスクの同時実行

ビルドライフサイクル

  1. 初期化フェーズ: プロジェクトの設定と参加範囲の決定
  2. 設定フェーズ: タスクの設定と依存関係の構築
  3. 実行フェーズ: タスクグラフの実行

依存関係管理

Gradleの依存関係管理は、Mavenより柔軟で、モジュール構築と消費の区別を明確にします。

メリット・デメリット

メリット

  • 高速パフォーマンス: Mavenより2-10倍高速
  • 柔軟性: カスタムビルドロジックが容易
  • モダンなDSL: Groovy/Kotlinでの直感的な記述
  • インクリメンタルビルド: 変更部分のみ再ビルド
  • ビルドキャッシュ: ローカルおよびリモートキャッシュ対応
  • マルチ言語対応: 各種プログラミング言語に対応
  • Android公式サポート: GoogleがAndroidの公式ビルドツールとして採用
  • 依存関係の高度管理: フィーチャーバリアントなどの高度な機能

デメリット

  • 学習コスト: Mavenより学習が困難
  • 複雑性: 柔軟性が逆に複雑さを生むことがある
  • プラグイン数: Mavenと比較してプラグイン数が少ない
  • 相対的に新しいツール: 精通した開発者が限定的
  • デバッグの難しさ: 複雑なビルドスクリプトのデバッグが困難
  • メモリ使用量: デーモンプロセスによるメモリ消費

参考ページ

書き方の例

プロジェクトの作成

# Gradle プロジェクトの新規作成
gradle init --type java-application

# Spring Boot プロジェクトの作成
gradle init --type java-application --dsl kotlin

# Kotlin プロジェクトの作成
gradle init --type kotlin-application

# Android プロジェクトの作成
gradle init --type android-application

build.gradleの設定 (Groovy DSL)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'

repositories {
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'junit:junit:4.13.2'
    
    // ログライブラリ
    implementation 'ch.qos.logback:logback-classic'
}

tasks.named('test') {
    useJUnitPlatform()
}

// カスタムタスク
task hello {
    doLast {
        println 'Hello, Gradle!'
    }
}

build.gradle.ktsの設定 (Kotlin DSL)

plugins {
    java
    id("org.springframework.boot") version "3.2.0"
    id("io.spring.dependency-management") version "1.1.4"
}

group = "com.example"
version = "1.0.0"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("junit:junit:4.13.2")
}

tasks.withType<Test> {
    useJUnitPlatform()
}

// カスタムタスク
tasks.register("hello") {
    doLast {
        println("Hello, Gradle!")
    }
}

依存関係の管理

dependencies {
    // コンパイル時と実行時に必要
    implementation 'org.apache.commons:commons-lang3:3.12.0'
    
    // コンパイル時のみ必要
    compileOnly 'org.projectlombok:lombok:1.18.30'
    
    // 実行時のみ必要
    runtimeOnly 'mysql:mysql-connector-java:8.0.33'
    
    // テスト時のみ必要
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    
    // 特定の依存関係を除外
    implementation('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    
    // バージョン範囲の指定
    implementation 'com.google.guava:guava:30.0+'
}

タスクの実行

# プロジェクトのクリーン
./gradlew clean

# コンパイル
./gradlew compileJava

# テスト実行
./gradlew test

# ビルド(コンパイル、テスト、パッケージ)
./gradlew build

# テストをスキップしてビルド
./gradlew build -x test

# アプリケーション実行
./gradlew run

# JARファイルの作成
./gradlew jar

# タスク一覧の表示
./gradlew tasks

# 依存関係ツリーの表示
./gradlew dependencies

# ビルドキャッシュの有効化
./gradlew build --build-cache

# パラレル実行
./gradlew build --parallel

カスタムタスク

// シンプルなタスク
task hello {
    doLast {
        println 'Hello, World!'
    }
}

// ファイルコピータスク
task copyFiles(type: Copy) {
    from 'src/main/resources'
    into 'build/resources'
    include '**/*.properties'
}

// 依存関係を持つタスク
task buildAndCopy(dependsOn: [build, copyFiles]) {
    doLast {
        println 'Build and copy completed!'
    }
}

// 入力ファイルを持つタスク
task generateDocs {
    inputs.files fileTree('src/main/java')
    outputs.file 'build/docs/api.html'
    
    doLast {
        // Javadoc生成ロジック
    }
}

マルチプロジェクトビルド

// settings.gradle
rootProject.name = 'my-multi-project'
include 'core', 'web', 'api'

// ルートプロジェクトの build.gradle
allprojects {
    group = 'com.example'
    version = '1.0.0'
    
    repositories {
        mavenCentral()
    }
}

subprojects {
    apply plugin: 'java'
    
    sourceCompatibility = '17'
    targetCompatibility = '17'
    
    dependencies {
        testImplementation 'junit:junit:4.13.2'
    }
}

// サブプロジェクトの build.gradle (webモジュール)
dependencies {
    implementation project(':core')
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

// プロジェクト間の依存関係
./gradlew :web:build  // webモジュールのビルド
./gradlew build      // 全モジュールのビルド