Gradle adalah build tool modern yang menjadi standar untuk proyek Kotlin dan Android. Dibandingkan Maven, Gradle menawarkan fleksibilitas lebih (build script adalah kode yang dapat diprogram) dan kecepatan inkremental lebih baik berkat configuration cache dan daemon. Pada chapter ini kita akan membahas konsep dasar Gradle: tiga fase build lifecycle, perbedaan Kotlin DSL dengan Groovy DSL, serta perintah-perintah Gradle yang paling sering dipakai.
Tiga Fase Build Lifecycle #
Setiap pemanggilan Gradle melewati tiga fase berurutan:
| Fase | Yang terjadi | Output |
|---|---|---|
| Initialization | settings.gradle(.kts) dievaluasi; proyek yang akan dibangun dibuat | Daftar objek Project |
| Configuration | build.gradle(.kts) setiap proyek dievaluasi dari atas ke bawah; task graph dibangun | Directed acyclic graph (DAG) dari task |
| Execution | Task yang diminta + dependensinya dijalankan sesuai urutan topologi | Artefak build (JAR, laporan test, dll.) |
Pemahaman fase ini penting karena kesalahan konfigurasi sering muncul saat configuration phase (sebelum task apapun berjalan). Misalnya, referensi ke tasks.named("compileKotlin") di dalam blok tasks lain dijalankan saat configuration, bukan execution.
Kotlin DSL vs Groovy DSL #
Gradle mendukung dua bahasa untuk menulis build script:
| Aspek | Kotlin DSL (build.gradle.kts) | Groovy DSL (build.gradle) |
|---|---|---|
| Bahasa | Kotlin (statis, type-safe) | Groovy (dinamis) |
| Ekstensi file | .gradle.kts | .gradle |
| Autocomplete IDE | Lengkap (IntelliJ) | Terbatas |
| Performa configuration | Lebih cepat sejak Gradle 7+ | Standar |
| Default proyek Kotlin/Android | Ya | Tidak (legacy) |
Untuk proyek Kotlin baru, selalu pakai Kotlin DSL. Sintaksis lebih konsisten dengan kode aplikasi, dan dukungan IDE lebih kuat.
Struktur build.gradle.kts Minimal #
plugins {
kotlin("jvm") version "2.0.21"
}
group = "com.example"
version = "1.0.0"
repositories {
mavenCentral()
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
testImplementation(kotlin("test"))
}
kotlin {
jvmToolchain(21)
}Mari kita bedah elemen-elemen di atas:
plugins { kotlin("jvm") version "2.0.21" }: mendaftarkan plugin Kotlin JVM. Plugin ini menambah taskcompileKotlin,compileTestKotlin,kotlinSourcesJar, dsb.groupdanversion: koordinat Maven untuk artefak yang dihasilkan.repositories { mavenCentral() }: dari mana dependensi akan diunduh.dependencies { ... }: deklarasi dependensi per configuration (implementation,testImplementation).kotlin { jvmToolchain(21) }: menetapkan JDK 21 sebagai target kompilasi dan runtime.
Perintah Gradle Umum #
Kode berikut mencantumkan perintah Gradle yang paling sering dipakai sebagai cheat sheet interaktif:
fun main() {
println("=== Demo Build Lifecycle Gradle ===")
println("Gradle mengelola tiga fase: init, configure, execute")
println()
println("Fase Initialization:")
println(" settings.gradle.kts dievaluasi; proyek root + subproyek dibuat")
println()
println("Fase Configuration:")
println(" build.gradle.kts setiap proyek dievaluasi secara berurutan")
println(" Task graph dibangun dari dependensi antar task")
println()
println("Fase Execution:")
println(" Task yang diminta + dependensinya dijalankan sesuai urutan")
println()
println("Perintah Gradle yang umum:")
println(" ./gradlew build : kompilasi + test + packaging")
println(" ./gradlew clean : hapus direktori build/")
println(" ./gradlew test : jalankan unit test")
println(" ./gradlew compileKotlin : kompilasi Kotlin saja")
println(" ./gradlew tasks : daftar semua task tersedia")
println(" ./gradlew <task> --info : log verbose untuk debugging")
}Output yang Dihasilkan:
=== Demo Build Lifecycle Gradle ===
Gradle mengelola tiga fase: init, configure, execute
Fase Initialization:
settings.gradle.kts dievaluasi; proyek root + subproyek dibuat
Fase Configuration:
build.gradle.kts setiap proyek dievaluasi secara berurutan
Task graph dibangun dari dependensi antar task
Fase Execution:
Task yang diminta + dependensinya dijalankan sesuai urutan
Perintah Gradle yang umum:
./gradlew build : kompilasi + test + packaging
./gradlew clean : hapus direktori build/
./gradlew test : jalankan unit test
./gradlew compileKotlin : kompilasi Kotlin saja
./gradlew tasks : daftar semua task tersedia
./gradlew <task> --info : log verbose untuk debuggingMari kita telaah kode di atas:
- Tiga fase: ditampilkan dalam urutan sesuai eksekusi Gradle. Initialization selalu pertama karena memuat
settings.gradle.ktsyang mendefinisikan proyek apa saja yang akan dibangun. - Configuration phase: setiap
build.gradle.ktsdijalankan sebagai kode Kotlin. Side-effect utamanya adalah menambah task dan deklarasi dependensi ke dalam task graph. - Execution phase: hanya task yang diminta beserta dependensinya dijalankan. Bila kita memanggil
./gradlew build, makacompileKotlin,processResources,classes,test,jarikut berjalan sesuai DAG.
Gradle Wrapper #
Setiap proyek Gradle sebaiknya menyertakan wrapper (gradlew, gradlew.bat, dan gradle/wrapper/ directory). Wrapper memastikan versi Gradle yang dipakai sama di setiap developer dan CI:
# Generate wrapper di proyek baru (butuh Gradle lokal)
gradle wrapper --gradle-version 8.10
# Eksekusi task dengan wrapper
./gradlew build
# Upgrade versi wrapper
./gradlew wrapper --gradle-version 8.10Cache dan Daemon #
Gradle menggunakan beberapa lapisan cache untuk mempercepat build berulang:
- Daemon: proses JVM tetap hidup antar invokasi. Default aktif sejak Gradle 3.0.
- Configuration cache (Gradle 7+): hasil konfigurasi di-cache; build inkremental melewati configuration phase.
- Build cache: artefak task disimpan lokal atau di server remote; dapat dibagi antar CI dan developer.
- File-system cache: dependensi diunduh sekali ke
~/.gradle/caches/.
Flag untuk mematikan / mengaktifkan cache:
# Mematikan daemon (untuk debugging)
./gradlew build --no-daemon
# Mengaktifkan configuration cache
./gradlew build --configuration-cache
# Membersihkan cache lokal
./gradlew --refresh-dependenciesReferensi Lanjutan #
- Gradle — panduan resmi Kotlin + Gradle untuk konfigurasi dasar proyek Gradle
- Gradle User Guide — buku panduan Gradle yang merinci build script, task, dan lifecycle
Penutup #
Pemahaman lifecycle init-configure-execute dan perbedaan DSL menjadi landasan untuk membaca build script Gradle. Pada chapter berikutnya kita akan membahas kotlin-gradle-plugin yang mengintegrasikan kotlinc ke dalam ekosistem Gradle.