Sebelum membahas Gradle dan Maven, penting untuk memahami alat yang menjadi fondasi keduanya: kotlinc, command-line compiler Kotlin. Mengetahui opsi kotlinc secara langsung membantu saat debugging masalah kompilasi, menulis script otomatisasi, atau membangun proyek kecil tanpa build tool lengkap. Pada chapter ini kita akan menelusuri mode-mode kotlinc, opsi yang paling sering dipakai, perbedaan target kompilasi (JVM, JS, Native), serta cara mengaktifkan mode daemon untuk mempercepat kompilasi berulang.
Tiga Varian kotlinc #
Distribusi Kotlin compiler terdiri atas beberapa launcher terpisah yang masing-masing menargetkan backend berbeda:
| Perintah | Target output | Use case |
|---|---|---|
kotlinc-jvm (atau kotlinc) | Bytecode JVM (.class/.jar) | Server, Android, CLI |
kotlinc-js | JavaScript (.js) | Frontend web, Node.js |
kotlinc-native | Native binary (Kotlin/Native) | iOS, embedded, tanpa JVM |
Pada Course ini kita berfokus pada kotlinc-jvm karena target utama Kotlin/JVM. Perintah kotlinc tanpa akhiran adalah alias ke kotlinc-jvm.
Opsi yang Sering Dipakai #
# Kompilasi sederhana: menghasilkan .class di direktori yang sama
kotlinc Halo.kt
# Kompilasi dengan output ke direktori tertentu
kotlinc Halo.kt -d out/
# Menghasilkan JAR yang dapat berdiri sendiri (serta kotlin-stdlib)
kotlinc Halo.kt -include-runtime -d app.jar
# Menjalankan JAR
java -jar app.jar
# Kompilasi dengan classpath dependensi eksternal
kotlinc -cp libs/ktor-server-core.jar Aplikasi.kt -d out/
# Mengatur target bytecode JVM (default: 1.8 sejak Kotlin 1.5; 21 jika didukung)
kotlinc -jvm-target 21 Halo.kt -d out/
# Mengabaikan peringatan compiler
kotlinc -nowarn Halo.kt -d out/
# Mode interaktif REPL
kotlincMode Daemon #
Saat kotlinc dipanggil berulang kali (mis. dari Gradle atau script build), startup JVM untuk setiap invokasi memakan waktu 200-500 ms. Mode daemon mengatasi overhead ini dengan menjaga compiler tetap hidup di latar belakang. Mode ini diaktifkan otomatis oleh Gradle dan IDEA; dari CLI, kita dapat memakainya via -daemon:
# Kompilasi menggunakan daemon yang sudah berjalan (memulai daemon bila belum ada)
kotlinc-daemon Halo.kt -d out/
# Menghentikan daemon
kotlinc -stop-daemonREPL dan Kotlin Script #
kotlinc tanpa argumen membuka REPL (Read-Eval-Print Loop) interaktif. REPL cocok untuk eksperimen cepat:
$ kotlinc
Welcome to Kotlin version 2.0.21
Type :help for help, :quit for quit
>>> 1 + 2
3
>>> val nama = "Budi"
>>> println("Halo $nama")
Halo BudiKotlin Script (.kts) adalah file yang dapat dieksekusi langsung tanpa kompilasi eksplisit. Script dipakai oleh Gradle Kotlin DSL (build.gradle.kts) dan kotlin-main-kts:
# Eksekusi file .kts langsung
kotlinc -script hello.main.kts
# Contoh isi hello.main.kts:
#!/usr/bin/env kotlinc -script
println("Halo dari Kotlin Script")Demonstrasi Opsi Compiler #
Kode berikut menghasilkan output yang menjelaskan opsi-opsi compiler. Saat dikompilasi dengan kotlinc -include-runtime, kita memperoleh JAR yang dapat dieksekusi langsung.
fun main() {
println("=== Demo Kotlin Compiler ===")
println("File ini dikompilasi dengan: kotlinc -include-runtime -d app.jar halo_kompiler.kt")
println("Dieksekusi dengan: java -jar app.jar")
println()
println("File .class hasil kompilasi:")
println(" Halo_kompilerKt.class (top-level functions ditempatkan di class synthetic)")
println()
println("Opsi kotlinc yang umum:")
println(" -include-runtime : sertakan kotlin-stdlib di JAR output")
println(" -cp <path> : classpath untuk dependensi")
println(" -d <dir> : direktori output (default: current)")
println(" -nowarn : sembunyikan peringatan compiler")
println(" -jvm-target 21 : target bytecode versi 21")
println(" -script : eksekusi file .kts (Kotlin Script)")
println()
println("Versi compiler:")
println(" ${KotlinVersion.CURRENT}")
println(" KotlinVersion.CURRENT.isAtLeast(2, 0): ${KotlinVersion.CURRENT.isAtLeast(2, 0)}")
}Output yang Dihasilkan:
=== Demo Kotlin Compiler ===
File ini dikompilasi dengan: kotlinc -include-runtime -d app.jar halo_kompiler.kt
Dieksekusi dengan: java -jar app.jar
File .class hasil kompilasi:
Halo_kompilerKt.class (top-level functions ditempatkan di class synthetic)
Opsi kotlinc yang umum:
-include-runtime : sertakan kotlin-stdlib di JAR output
-cp <path> : classpath untuk dependensi
-d <dir> : direktori output (default: current)
-nowarn : sembunyikan peringatan compiler
-jvm-target 21 : target bytecode versi 21
-script : eksekusi file .kts (Kotlin Script)
Versi compiler:
2.0.21
KotlinVersion.CURRENT.isAtLeast(2, 0): trueMari kita telaah kode di atas:
KotlinVersion.CURRENT: properti standar Kotlin yang mengembalikan versi compiler. Output cocok dengan outputkotlinc -version.isAtLeast(2, 0): method utilitas untuk membandingkan versi. Berguna saat kode memerlukan fitur tertentu (mis. K2 hanya stabil di 2.0+).- Daftar opsi compiler: ditampilkan dalam output agar pembaca dapat melihat ringkasan praktis. Daftar ini dapat dipakai sebagai cheat sheet saat menulis script build manual.
Perbedaan kotlinc dan java untuk Eksekusi #
Untuk program Kotlin sederhana, dua langkah diperlukan:
# 1. Kompilasi: menghasilkan HaloKt.class
kotlinc Halo.kt -d out/
# 2. Eksekusi: memerlukan kotlin-stdlib di classpath
java -cp "out/:/path/ke/kotlin-stdlib.jar" HaloKtOpsi -include-runtime menggabungkan kotlin-stdlib ke dalam JAR output sehingga perintah java -jar app.jar cukup. Tradeoff-nya adalah ukuran JAR yang lebih besar (~1.5 MB untuk aplikasi sederhana). Untuk distribusi yang lebih kompak, pakai Gradle/Maven yang dapat menghasilkan fat JAR dengan dependensi yang benar-benar dipakai saja.
Referensi Lanjutan #
- Kotlin command-line compiler
— dokumentasi resmi kompilator baris perintah Kotlin termasuk opsi
kotlincdankotlin - Install Kotlin — panduan instalasi kompilator Kotlin di macOS, Linux, dan Windows
Penutup #
kotlinc adalah alat fundamental yang dipanggil di balik layar oleh setiap build tool Kotlin. Pemahaman opsi kotlinc menjadi modal untuk membaca log build Gradle/Maven yang sering kali menampilkan argumen yang dilewatkan ke compiler. Pada chapter berikutnya kita akan menaikkan satu tingkat abstraksi: Gradle sebagai build tool yang mengotomasi pemanggilan kotlinc.