Gradle
ビルドツール・パッケージマネージャー
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など
- 豊富なプラグイン: 扩張可能なエコシステム
- マルチプロジェクトビルド: 大規模プロジェクトの効率的管理
パフォーマンス最適化
- インクリメンタリティ: 入力/出力の追跡で不要な作業を回避
- ビルドキャッシュ: 同じ入力のビルド結果を再利用
- Gradleデーモン: ビルド情報をメモリに保持し高速化
- パラレル実行: 獨立したタスクの同時実行
ビルドライフサイクル
- 初期化フェーズ: プロジェクトの設定と参加範囲の決定
- 設定フェーズ: タスクの設定と依存関係の構築
- 実行フェーズ: タスクグラフの実行
依存関係管理
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 // 全モジュールのビルド