Proyek Kotlin skala nyata tidak ditulis sebagai satu file .kt lepas. Kita mengelola ratusan file, dependensi eksternal, dan konfigurasi build yang harus dapat direproduksi di mesin lain. Gradle adalah standar de facto untuk proyek Kotlin, dan layout direktori yang konsisten membantu IDE sekaligus developer lain memahami proyek kita dengan cepat. Pada chapter ini kita akan membedah struktur standar proyek Kotlin/Gradle, konvensi penamaan file, dan hubungan antara deklarasi package dengan struktur direktori.

Layout Standar Gradle #

Proyek Kotlin yang dibuat dengan Gradle mengikuti layout yang sudah disepakati komunitas. Layout ini dikenal sebagai Gradle JVM convention dan didukung penuh oleh Kotlin plugin.

text
my-app/
├── build.gradle.kts            # Skrip build utama
├── settings.gradle.kts         # Nama proyek dan modul
├── gradle.properties           # Properti Gradle (opsional)
├── gradlew                     # Wrapper Gradle (Linux/macOS)
├── gradlew.bat                 # Wrapper Gradle (Windows)
├── gradle/wrapper/             # Berkas wrapper
└── src/
    ├── main/
    │   ├── kotlin/             # Kode produksi
    │   └── resources/          # Aset non-kode produksi (config, template)
    └── test/
        ├── kotlin/             # Kode pengujian
        └── resources/          # Aset pengujian

Sumber utama kode ada di src/main/kotlin/, kode pengujian di src/test/kotlin/. Gradle secara otomatis mengenali kedua folder ini sebagai source set utama dan pengujian, masing-masing dengan classpath-nya sendiri.

Memetakan Struktur #

Untuk memahami peran setiap berkas dan direktori, mari kita lihat satu program sederhana yang mencetak daftar komponen proyek.

kotlin
fun main() {
    val struktur = listOf(
        "build.gradle.kts" to "konfigurasi build",
        "settings.gradle.kts" to "nama proyek dan modul",
        "src/main/kotlin/" to "kode produksi",
        "src/test/kotlin/" to "kode pengujian"
    )
    println("Struktur Proyek Kotlin/Gradle:")
    struktur.forEach { (berkas, keterangan) ->
        println("  $berkas - $keterangan")
    }
    println("Konvensi Gradle diterapkan")
}

Output yang Dihasilkan:

text
Struktur Proyek Kotlin/Gradle:
  build.gradle.kts - konfigurasi build
  settings.gradle.kts - nama proyek dan modul
  src/main/kotlin/ - kode produksi
  src/test/kotlin/ - kode pengujian
Konvensi Gradle diterapkan

Mari kita bedah beberapa bagian kode di atas:

  1. "build.gradle.kts" to "...": notasi infix to membuat objek Pair<String, String>. Pasangan ini nanti didekonstruksi saat diiterasi.
  2. forEach { (berkas, keterangan) -> ... }: lambda menerima Pair dan langsung melakukan destructuring ke dua variabel berkas dan keterangan tanpa kita harus menyebut it.first dan it.second.
  3. println(" $berkas - $keterangan"): string template menyisipkan dua nilai sekaligus ke dalam teks yang dicetak, memberi jarak indentasi dua spasi untuk keterbacaan.

build.gradle.kts #

build.gradle.kts adalah skrip build utama yang ditulis dengan Kotlin DSL (bukan Groovy). Berkas ini mendefinisikan plugin, dependensi, dan konfigurasi build.

kotlin build.gradle.kts (kerangka umum)
plugins {
    kotlin("jvm") version "2.0.21"
    application
}

group = "com.example"
version = "1.0.0"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
    testImplementation(kotlin("test"))
}

application {
    mainClass.set("com.example.MainKt")
}

Penjelasan blok utama:

  • plugins: mendaftarkan plugin Kotlin JVM dan plugin application untuk membuat berkas .jar yang dapat dijalankan.
  • repositories: sumber unduh dependensi. mavenCentral() adalah repositori publik default.
  • dependencies: dependensi eksternal. implementation untuk kode produksi, testImplementation untuk pengujian.
  • application: menentukan class utama yang akan dipanggil saat ./gradlew run dijalankan.

settings.gradle.kts #

settings.gradle.kts mendefinisikan nama proyek dan daftar modul jika proyek memiliki banyak submodul. Untuk proyek tunggal, isinya sederhana.

kotlin settings.gradle.kts (proyek tunggal)
rootProject.name = "my-app"

Untuk proyek multi-modul:

kotlin settings.gradle.kts (multi-modul)
rootProject.name = "my-app"

include("app")
include("lib-core")
include("lib-utils")

Konvensi Penamaan File #

Kotlin tidak mengharuskan nama file sama dengan nama class publik seperti Java. Namun, ada konvensi yang diikuti komunitas:

SituasiKonvensi
Satu class utama per fileNama file sama dengan nama class: Pengguna.kt berisi class Pengguna
Beberapa function level tinggiNama file deskriptif: util.kt, math.kt
Function mainMain.kt atau nama domain spesifik: App.kt
File berisi extension functionStringExtensions.kt, DateExtensions.kt

Deklarasi package dan Direktori #

Di Java, deklarasi package wajib sama dengan struktur direktori. Di Kotlin, aturan ini dilonggarkan: deklarasi package tidak harus mengikuti direktori, tetapi dianjurkan mengikuti agar konsisten dengan praktik industri.

text
src/main/kotlin/
└── com/
    └── example/
        └── myapp/
            ├── Main.kt
            └── model/
                └── Pengguna.kt
kotlin Pengguna.kt
package com.example.myapp.model

data class Pengguna(val nama: String, val umur: Int)

Tanpa kepatuhan konvensi ini, kode tetap kompilasi, tetapi developer lain akan kesulitan menemukan file berdasarkan deklarasi package-nya.

Gradle Wrapper #

Setiap proyek Kotlin/Gradle seharusnya menyertakan Gradle Wrapper: berkas gradlew, gradlew.bat, dan folder gradle/wrapper/. Wrapper menjamin versi Gradle yang dipakai konsisten di semua mesin.

bash
# Menjalankan build dengan wrapper (Linux/macOS)
./gradlew build

# Windows
gradlew.bat build

# Menjalankan aplikasi
./gradlew run

Tanpa wrapper, setiap developer harus memasang Gradle secara manual dengan versi yang tepat. Wrapper menyelesaikan masalah ini dengan mengunduh Gradle versi yang ditentukan secara otomatis.

Referensi Resmi #

Dokumentasi resmi untuk struktur proyek Kotlin dan Gradle tersedia di:

Referensi Lanjutan #

Selanjutnya #

Struktur proyek sudah jelas, dan kita siap menulis kode yang lebih bermakna. Tapi sebelum benar-benar mulai, ada tiga cara umum untuk menjalankan program Kotlin yang perlu kita pahami. Pada chapter berikutnya, Menjalankan Program Kotlin, kita akan membandingkan kompilasi .kt ke .jar, mode script kotlin file.kt, dan shebang ./file.kt untuk memilih jalur yang sesuai dengan kebutuhan kita.