Dua baris di build.gradle.kts — java dan application — mendatangkan seluruh pasukan task: kompilasi, pengujian, pengemasan, hingga perintah menjalankan aplikasi. Kekuatan itu berasal dari plugin: unit distribusi yang mendaftarkan task, extension, dan aturan integrasi ke dalam sebuah proyek Gradle. Hampir semua yang membuat build terasa produktif — dari compileJava sampai bootRun milik Spring Boot — adalah sumbangan plugin, bukan fitur inti Gradle. Pada chapter ini kita akan memahami cara menerapkan plugin, apa saja yang didaftarkannya, dan bagaimana mengonfigurasi lewat extension.
Cara Menerapkan Plugin #
Plugin diterapkan pada blok plugins yang berada paling atas di build.gradle.kts:
plugins {
java
application
}Id java dan application adalah plugin bawaan Gradle — tidak perlu versi karena Gradle membawanya sendiri. Id seperti org.springframework.boot mengacu pada plugin di Gradle Plugin Portal atau Maven Central, sehingga wajib menyertakan versi: id("org.springframework.boot") version "3.3.0". Blok plugins adalah cara modern yang deklaratif dan aman — plugin diterapkan tepat satu kali meski ditulis di beberapa tempat.
Bentuk lawas apply(from = "...") atau apply plugin: "java" masih ditemui di build lama: pendekatan imperatif yang bisa dipanggil berkali-kali dari lokasi berbeda, sehingga urutan dan kondisi penerapan menjadi sulit dilacak. Migrasi ke blok plugins adalah praktik yang direkomendasikan dokumentasi resmi Gradle.
Apa yang Dibawa Sebuah Plugin #
Setiap plugin menyumbang dua hal utama: task yang bisa dieksekusi dan extension — objek konfigurasi bertipe yang menampung setelan milik plugin. Program berikut merangkum kontribusi tiga plugin yang paling sering dipakai proyek Java:
public class TerapkanPlugin {
// {id plugin, task yang didaftarkan, extension konfigurasinya}
private static final String[][] PLUGIN = {
{"java",
"compileJava, classes, test, jar, javadoc, assemble, check, build",
"java (sourceCompatibility, targetCompatibility)"},
{"application",
"run, installDist, distZip, distTar",
"application (mainClass, applicationDefaultJvmArgs)"},
{"org.springframework.boot",
"bootJar, bootRun",
"springBoot (buildInfo)"}
};
public static void main(String[] args) {
for (String[] p : PLUGIN) {
System.out.println("menerapkan plugin '" + p[0] + "'");
System.out.println(" task terdaftar : " + p[1]);
System.out.println(" extension : " + p[2]);
System.out.println();
}
System.out.println("plugin application menerapkan plugin java secara implisit");
System.out.println("task 'run' membutuhkan mainClass terisi sebelum dieksekusi");
}
}Output yang Dihasilkan:
menerapkan plugin 'java'
task terdaftar : compileJava, classes, test, jar, javadoc, assemble, check, build
extension : java (sourceCompatibility, targetCompatibility)
menerapkan plugin 'application'
task terdaftar : run, installDist, distZip, distTar
extension : application (mainClass, applicationDefaultJvmArgs)
menerapkan plugin 'org.springframework.boot'
task terdaftar : bootJar, bootRun
extension : springBoot (buildInfo)
plugin application menerapkan plugin java secara implisit
task 'run' membutuhkan mainClass terisi sebelum dieksekusiTiga pola terbaca dari rangkuman tersebut. Pertama, plugin java adalah fondasi — seluruh task dari chapter Gradle Fundamentals berasal dari plugin ini, dan extension java mengatur kompatibilitas bahasa yang akan dikompilasi. Kedua, plugin application tidak menggantikan apa pun; plugin ini menambah task run dan installDist di samping task milik plugin java, karena menerapkan plugin baru tidak menghapus task yang sudah ada. Ketiga, plugin pihak ketiga seperti Spring Boot mengikuti pola yang sama — bootJar mengemas fat jar dengan launcher tersarang, dan bootRun menjalankan aplikasi langsung dari build.
Plugin application #
Plugin application mengubah proyek Java menjadi aplikasi yang dapat dieksekusi. Extension application menentukan class utama lewat property mainClass:
application {
mainClass.set("com.toko.gudang.AplikasiGudang")
}Setelah extension terisi, perintah-perintah berikut menjadi tersedia:
gradle run
gradle installDistTask run mengeksekusi method main dari mainClass langsung dari hasil kompilasi build — siklus edit-jalankan tanpa langkah pengemasan. Task installDist membangun direktori distribusi berisi skrip peluncur untuk Linux/macOS dan Windows; hasilnya di build/install/<nama-proyek>/bin/ memberikan aplikasi mandiri yang siap ditaruh di server. Nilai mainClass memakai set(...) karena seluruh property extension bertipe Property<String> — bagian dari API lazy yang kita bahas di chapter Gradle Build Lifecycle.
Plugin Ekosistem #
Dua nama menutup peta plugin JVM modern. Plugin Android (com.android.application) adalah pintu masuk seluruh pengembangan aplikasi Android — mendaftarkan task assembleDebug, assembleRelease, dan integrasi lint serta packaging AAB/APK. Plugin Spring Boot (org.springframework.boot) bekerja di atas plugin java: task bootJar membangun JAR eksekusi yang memuat dependency di dalam BOOT-INF/ dengan launcher tersarang — pendekatan fat jar yang sedikit berbeda dari shading Maven, dan task bootRun menjadi cara tercepat menjalankan aplikasi selama pengembangan.
Bila kebutuhan tim bersifat khusus, Gradle juga bisa menjadi tuan rumah plugin internal: sebuah precompiled script plugin berupa berkas .gradle.kts yang dikompilasi dan dibagikan antar modul, hingga plugin penuh berbasis Kotlin dengan task dan extension tersendiri.
Konfigurasi plugin, task, dan dependency kini lengkap di tangan kita. Namun satu angka kecil menentukan nasib semuanya: nomor versi. Bagaimana 2.17.1 dibaca, kapan naik ke 2.18.0, dan mengapa rentang versi justru berisiko — topik chapter berikutnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
TerapkanPlugin.java
Unduh berkaspublic class TerapkanPlugin {
// {id plugin, task yang didaftarkan, extension konfigurasinya}
private static final String[][] PLUGIN = {
{"java",
"compileJava, classes, test, jar, javadoc, assemble, check, build",
"java (sourceCompatibility, targetCompatibility)"},
{"application",
"run, installDist, distZip, distTar",
"application (mainClass, applicationDefaultJvmArgs)"},
{"org.springframework.boot",
"bootJar, bootRun",
"springBoot (buildInfo)"}
};
public static void main(String[] args) {
for (String[] p : PLUGIN) {
System.out.println("menerapkan plugin '" + p[0] + "'");
System.out.println(" task terdaftar : " + p[1]);
System.out.println(" extension : " + p[2]);
System.out.println();
}
System.out.println("plugin application menerapkan plugin java secara implisit");
System.out.println("task 'run' membutuhkan mainClass terisi sebelum dieksekusi");
}
}