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.
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 pengujianSumber 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.
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:
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 diterapkanMari kita bedah beberapa bagian kode di atas:
"build.gradle.kts" to "...": notasi infixtomembuat objekPair<String, String>. Pasangan ini nanti didekonstruksi saat diiterasi.forEach { (berkas, keterangan) -> ... }: lambda menerimaPairdan langsung melakukan destructuring ke dua variabelberkasdanketerangantanpa kita harus menyebutit.firstdanit.second.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.
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 pluginapplicationuntuk membuat berkas.jaryang dapat dijalankan.repositories: sumber unduh dependensi.mavenCentral()adalah repositori publik default.dependencies: dependensi eksternal.implementationuntuk kode produksi,testImplementationuntuk pengujian.application: menentukan class utama yang akan dipanggil saat./gradlew rundijalankan.
settings.gradle.kts #
settings.gradle.kts mendefinisikan nama proyek dan daftar modul jika proyek memiliki banyak submodul. Untuk proyek tunggal, isinya sederhana.
rootProject.name = "my-app"Untuk proyek 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:
| Situasi | Konvensi |
|---|---|
| Satu class utama per file | Nama file sama dengan nama class: Pengguna.kt berisi class Pengguna |
| Beberapa function level tinggi | Nama file deskriptif: util.kt, math.kt |
Function main | Main.kt atau nama domain spesifik: App.kt |
| File berisi extension function | StringExtensions.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.
src/main/kotlin/
└── com/
└── example/
└── myapp/
├── Main.kt
└── model/
└── Pengguna.ktpackage 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.
# Menjalankan build dengan wrapper (Linux/macOS)
./gradlew build
# Windows
gradlew.bat build
# Menjalankan aplikasi
./gradlew runTanpa 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 #
- Kotlin Gradle plugin — panduan resmi Gradle untuk menata struktur direktori dan modul proyek Kotlin
- Kotlin Maven plugin — panduan resmi Maven sebagai alternatif build tool untuk proyek Kotlin
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.