Groovy dapat dipakai lewat tiga pintu masuk yang saling melengkapi, yaitu shell interaktif bernama groovysh, editor berjendela bernama groovyConsole, dan berkas skrip yang dijalankan langsung dari terminal. Shell adalah program yang membaca perintah satu per satu, mengeksekusinya, lalu menampilkan hasilnya seketika. Topik ini membahas cara kerja ketiganya, mulai dari evaluasi per pernyataan di groovysh, peluncuran berkas skrip dengan perintah groovy, penerimaan argumen baris perintah, hingga kompilasi dengan groovyc sebagai jembatan interoperabilitas dengan Java. Setelah membacanya, uji coba sintaks dapat dilakukan secepat mengetik di shell, sedangkan program utuh dapat ditulis sebagai berkas .groovy dan dijalankan berulang.
Mengeksplorasi kode dengan groovysh#
groovysh adalah read-eval-print loop (REPL), yaitu siklus yang membaca satu pernyataan, mengevaluasinya, mencetak hasilnya, lalu menunggu pernyataan berikutnya. Karakter groovy> adalah prompt, yaitu tanda bahwa shell siap menerima masukan. Ekspresi yang diketik langsung menampilkan nilainya tanpa perlu println, dan variabel yang dibuat dengan def bertahan selama sesi berlangsung. Sesi berikut adalah ilustrasi yang disederhanakan dari layar sesungguhnya, tanpa banner pembuka dan tanpa kode warna:
groovy> 2 + 3
5
groovy> def nilai = [70, 80, 90]
[70, 80, 90]
groovy> nilai.sum()
240
groovy> /vars
def nilai = [70, 80, 90]
groovy> /exitKarena setiap pernyataan dievaluasi seketika, groovysh paling cocok untuk eksperimen singkat, misalnya mencoba metode String, menghitung sesuatu, atau memeriksa perilaku koleksi. Program yang isinya sudah melebihi beberapa pernyataan lebih baik ditulis sebagai berkas skrip, sebab berkas dapat disunting dan dijalankan ulang tanpa mengetik ulang dari awal.
Perintah internal groovysh berawalan garis miring. /help mencantumkan perintah yang tersedia, /vars menampilkan variabel yang sudah dibuat selama sesi, dan /exit mengakhiri sesi. Dokumentasi resmi juga mencatat /history untuk melihat perintah yang pernah diketik dan /save untuk menyimpannya.
Mode multi-baris bekerja otomatis. Pernyataan yang kurungnya belum tertutup dilanjutkan pada baris berikutnya, sehingga ekspresi yang panjang tetap dapat diketik dengan rapi. Prompt pada baris lanjutan berbeda bentuknya dari prompt biasa, sehingga bagian yang masih menunggu pelengkap terlihat jelas.
# tidak-dijalankan
# memulai sesi groovysh, sesi diakhiri dengan mengetik /exit
groovyshMenulis dan menjalankan berkas dengan groovyConsole#
groovyConsole adalah editor berjendela berbasis Swing, yaitu antarmuka grafis (GUI) yang menyertai distribusi Groovy dan diluncurkan dengan perintah groovyConsole. Jendelanya memiliki panel masukan untuk menulis skrip dan panel keluaran untuk menampilkan hasilnya. Ketika perintah Run pada menu Actions dipilih, konsol mengompilasi skrip lalu menjalankannya. Seluruh keluaran println tampil di panel keluaran, dan nilai kembalian skrip yang tidak null ikut dicetak.
Fiturnya mencakup membuka dan menyimpan berkas .groovy, riwayat perintah dan hasil, serta penampil abstract syntax tree (AST) untuk memeriksa struktur kode hasil kompilasi. Penampil AST berguna untuk memahami cara kerja transformasi anotasi, karena kode yang dihasilkan kompilator dapat dilihat langsung. Untuk eksperimen yang sudah lebih panjang dari beberapa pernyataan tetapi belum memerlukan proyek lengkap, groovyConsole memberi kenyamanan editor tanpa perlu menghafal perintah terminal.
Karena berupa aplikasi GUI, groovyConsole memerlukan lingkungan desktop dengan layar. Pada server tanpa antarmuka grafis, jendelanya tidak dapat dibuka, sehingga groovysh dan berkas skrip dari terminal tetap dapat dipakai. Keduanya memenuhi kebutuhan yang sama, karena bahasa yang sama dijalankan lewat jalur yang berbeda.
Menjalankan skrip dengan perintah groovy#
Cara paling umum menjalankan kode Groovy adalah dengan perintah groovy diikuti nama berkas skripnya. Isi skrip ditulis sebagai pernyataan tingkat atas tanpa kelas dan tanpa metode main, lalu dieksekusi berurutan dari atas ke bawah. Skrip berikut menghitung statistik sederhana dari daftar nilai ujian yang tetap, lengkap dengan rata-ratanya.
// statistik.groovy: statistik nilai ujian dari daftar tetap
def statistik(List<Integer> nilai) {
def rataRata = nilai.sum() / nilai.size()
"n=${nilai.size()} min=${nilai.min()} max=${nilai.max()} rata-rata=${rataRata}"
}
def nilaiUjian = [78, 85, 90, 65, 72]
println statistik(nilaiUjian)n=5 min=65 max=90 rata-rata=78# tidak-dijalankan
# menjalankan skrip dari folder tempat berkasnya disimpan
groovy statistik.groovyDi balik layar, kompilator Groovy mengubah berkas skrip menjadi kelas yang mewarisi groovy.lang.Script, lalu menjalankan metode run() milik kelas tersebut. Penugasan variabel tanpa def tidak menghasilkan variabel lokal, melainkan menyimpan nilainya ke binding, yaitu wadah variabel milik skrip yang dapat diakses dari luarnya. Kedua sifat ini dapat diperiksa langsung dari dalam skrip.
penghitung = 41
println "Kelas skrip : ${this.getClass().superclass.name}"
println "Milik binding : ${binding.hasVariable('penghitung')}"Kelas skrip : groovy.lang.Script
Milik binding : trueBaris pertama keluaran memperlihatkan bahwa skrip benar-benar dijalankan sebagai kelas turunan groovy.lang.Script. Nilai true pada baris kedua membuktikan bahwa penghitung yang ditugaskan tanpa def tersimpan di binding, bukan di variabel lokal. Mekanisme inilah yang dipakai alat seperti groovyConsole ketika menyuntikkan variabel ke skrip yang dijalankannya.
Argumen baris perintah#
Skrip dapat menerima teks tambahan yang diketik setelah nama berkasnya saat diluncurkan. Teks tambahan itu tersedia di dalam skrip sebagai args, yaitu array (larik) String. Jumlahnya diperiksa lewat args.length, sedangkan tiap argumen diakses lewat indeksnya dengan args[0] sebagai yang pertama. Karena jumlah argumen tidak dijamin, akses langsung tanpa pemeriksaan berisiko menggagalkan skrip.
Skrip berikut menyapa petugas piket. Dua argumen berarti nama dan hari piket, sedangkan tanpa argumen skrip memakai nilai cadangan yang sudah ditentukan.
// sapa-piket.groovy: menyapa petugas piket, dengan atau tanpa argumen CLI
def sapa(String nama, String hari) {
println "Piket $hari: $nama"
}
if (args.length >= 2) {
sapa(args[0], args[1])
} else {
sapa('Citra', 'Rabu')
}Piket Rabu: CitraKeluaran di atas berasal dari peluncuran tanpa argumen, sehingga jalur else yang dijalankan. Peluncuran groovy sapa-piket.groovy Ali Senin mengisi args dengan dua nilai dan mencetak Piket Senin: Ali. Pola pemeriksaan args.length sebelum mengakses isi array menjadi pengaman standar pada skrip yang menerima masukan dari luar.
# tidak-dijalankan
# meluncurkan sapa-piket dengan dua argumen baris perintah
groovy sapa-piket.groovy Ali SeninSelain menjalankan berkas, perintah groovy dapat mengeksekusi kode langsung lewat opsi -e tanpa berkas sama sekali. Perilaku opsi ini berbeda dari groovysh dalam satu hal penting, yaitu hasil ekspresi tidak dicetak otomatis. Kode yang ingin menampilkan sesuatu wajib memakai println secara eksplisit.
# tidak-dijalankan
# mengeksekusi kode tanpa berkas, keluaran hanya berasal dari println
groovy -e "println 'Halo dari -e'"Kompilasi dengan groovyc dan pemanggilan dari Java#
Perintah groovyc mengompilasi berkas .groovy menjadi berkas .class berisi bytecode JVM, sebagaimana kompilator Java menghasilkan bytecode dari kode Java. Perintah groovy sebenarnya juga mengompilasi, tetapi hasilnya disimpan di memori dan langsung dijalankan, sedangkan groovyc menuliskannya sebagai berkas .class yang bertahan. Kelas yang memuat metode static void main dapat ditulis persis seperti kelas Java biasa.
// tidak-dijalankan
// kelas dengan metode main ala Java, disimpan sebagai Halo.groovy
class Halo {
static void main(String[] args) {
println "Halo dari kelas Groovy"
}
}# tidak-dijalankan
# mengompilasi skrip menjadi berkas .class
groovyc Halo.groovy
# menjalankan hasil kompilasi dengan java, pustaka Groovy wajib di classpath
java -cp ".:$GROOVY_HOME/lib/groovy-5.1.3.jar" HaloPemanggilan lewat java hanya berhasil ketika pustaka Groovy ikut berada di classpath. Tanpa pustaka itu, JVM melempar NoClassDefFoundError yang menyebut kelas groovy.lang.GroovyObject, karena hasil kompilasi groovyc tetap bergantung pada runtime Groovy. Variabel GROOVY_HOME menunjuk folder pemasangan Groovy, sedangkan pemasangan lewat SDKMAN menempatkan pustaka di folder ~/.sdkman/candidates/groovy/current/lib. Kebutuhan bersama pustaka inilah yang membuat groovyc berperan sebagai jembatan interoperabilitas, yaitu kelas buatan Groovy dapat dipakai dari kode Java biasa selama pustaka Groovy dibawa bersama aplikasi.
Kesalahan umum#
Kesalahan pertama adalah membaca args[0] tanpa memeriksa panjang array terlebih dahulu. Saat skrip diluncurkan tanpa satu argumen pun, args berupa array kosong, sehingga akses indeks pertamanya melempar ArrayIndexOutOfBoundsException dan skrip berhenti sebelum pekerjaannya selesai. Kegagalan semacam ini mudah terlewat saat pengembangan, karena skrip biasanya diuji dengan argumen lengkap dan baru gagal ketika dijalankan tanpa argumen oleh alat otomatis.
try {
println "Argumen pertama: ${args[0]}"
} catch (ArrayIndexOutOfBoundsException e) {
println "Gagal: ${e.getClass().simpleName}"
}
println "Jumlah argumen: ${args.length}"Gagal: ArrayIndexOutOfBoundsException
Jumlah argumen: 0Perbaikannya adalah memeriksa args.length lebih dahulu sebagaimana skrip sapa-piket.groovy, atau menyediakan nilai cadangan bila argumen tidak disediakan. Menangkap error dengan try-catch hanya menutup kegagalan di permukaan, sebab argumen yang dibutuhkan tetap tidak ada.
Kesalahan kedua adalah mengharapkan groovy -e "2 + 3" mencetak 5. Opsi -e tidak mencetak hasil ekspresi secara otomatis, sehingga perintah itu berakhir tanpa keluaran apa pun. Asumsi ini sering dibawa dari groovysh, yang memang selalu menampilkan hasil setiap ekspresi. Perbaikannya membungkus kode dengan println, sebagaimana contoh pada bagian argumen baris perintah.
Ringkasan#
- groovysh mengevaluasi satu pernyataan per siklus dan mencetak hasilnya secara otomatis, dengan perintah internal berawalan garis miring seperti
/help,/vars, dan/exitpada Groovy 5. - Perintah
groovymenjalankan berkas skrip sebagai kelas turunangroovy.lang.Script, pernyataan tingkat atasnya dieksekusi berurutan, dan variabel tanpadeftersimpan di binding. - Argumen baris perintah tersedia sebagai array
args, dan isinya wajib diakses setelahargs.lengthdiperiksa karena indeks pada array kosong melemparArrayIndexOutOfBoundsException. - groovyc menghasilkan berkas
.classyang dapat diluncurkan perintahjava, dengan syarat pustaka Groovy ikut berada di classpath.
Referensi#
- Groovysh — Apache Groovy — dokumentasi resmi shell REPL Groovy, mencakup perintah internal dan perilaku evaluasinya.
- groovyConsole — Apache Groovy — dokumentasi resmi konsol Swing, mencakup panel masukan dan keluaran, menu Actions, serta penampil AST.
- groovyc, the Groovy compiler — Apache Groovy — dokumentasi resmi kompilator Groovy beserta opsi pemakaiannya.