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:

FaseYang terjadiOutput
Initializationsettings.gradle(.kts) dievaluasi; proyek yang akan dibangun dibuatDaftar objek Project
Configurationbuild.gradle(.kts) setiap proyek dievaluasi dari atas ke bawah; task graph dibangunDirected acyclic graph (DAG) dari task
ExecutionTask yang diminta + dependensinya dijalankan sesuai urutan topologiArtefak 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:

AspekKotlin DSL (build.gradle.kts)Groovy DSL (build.gradle)
BahasaKotlin (statis, type-safe)Groovy (dinamis)
Ekstensi file.gradle.kts.gradle
Autocomplete IDELengkap (IntelliJ)Terbatas
Performa configurationLebih cepat sejak Gradle 7+Standar
Default proyek Kotlin/AndroidYaTidak (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 #

kotlin build.gradle.kts
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:

  1. plugins { kotlin("jvm") version "2.0.21" }: mendaftarkan plugin Kotlin JVM. Plugin ini menambah task compileKotlin, compileTestKotlin, kotlinSourcesJar, dsb.
  2. group dan version: koordinat Maven untuk artefak yang dihasilkan.
  3. repositories { mavenCentral() }: dari mana dependensi akan diunduh.
  4. dependencies { ... }: deklarasi dependensi per configuration (implementation, testImplementation).
  5. 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:

kotlin
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:

text
=== 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 debugging

Mari kita telaah kode di atas:

  1. Tiga fase: ditampilkan dalam urutan sesuai eksekusi Gradle. Initialization selalu pertama karena memuat settings.gradle.kts yang mendefinisikan proyek apa saja yang akan dibangun.
  2. Configuration phase: setiap build.gradle.kts dijalankan sebagai kode Kotlin. Side-effect utamanya adalah menambah task dan deklarasi dependensi ke dalam task graph.
  3. Execution phase: hanya task yang diminta beserta dependensinya dijalankan. Bila kita memanggil ./gradlew build, maka compileKotlin, processResources, classes, test, jar ikut 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:

bash
# 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.10

Cache 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:

bash
# Mematikan daemon (untuk debugging)
./gradlew build --no-daemon

# Mengaktifkan configuration cache
./gradlew build --configuration-cache

# Membersihkan cache lokal
./gradlew --refresh-dependencies

Referensi 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.