“Java versi berapa yang sebaiknya saya pelajari?” adalah pertanyaan pembuka yang wajar. Jawabannya bergantung pada dua hal: siklus rilis enam bulanan yang berjalan terus, dan status Long-Term Support (LTS) yang menentukan berapa lama sebuah versi dirawat. Salah memilih jarang berakibat fatal — kode Java 8 masih berjalan hari ini — tetapi pilihan yang tepat menghemat kerja migrasi bertahun-tahun ke depan. Chapter ini membahas siklus rilis, lini masa dukungan tiap LTS, ragam distribusi JDK, dan rekomendasi konkret untuk proyek baru maupun sistem lawas.
Siklus Rilis Enam Bulanan #
Sejak 2017, versi Java baru terbit setiap Maret dan September tanpa kecuali. Rilis ini bernomor urut — 26, 27, 28, begitu seterusnya — dan tiap rilis hanya membawa fitur yang benar-benar siap pada jadwal tersebut. Model ini menguntungkan pengembang fitur: hasil kerja terbit dalam hitungan bulan, bukan menunggu rilis besar bertahun-tahun. Konsekuensinya jelas pada sisi perawatan: rilis non-LTS hanya menerima pembaruan sampai rilis berikutnya keluar — sekitar enam bulan — lalu dianggap tergantikan. Memasang non-LTS untuk produksi jangka panjang berarti berhenti menerima perbaikan keamanan sebelum setahun.
Apa Itu LTS #
Setiap dua tahun, satu rilis September ditandai sebagai Long-Term Support: versi yang dijanjikan dirawat bertahun-tahun oleh Oracle, distribusi JDK, dan ekosistem framework. LTS adalah jangkar migrasi industri — tim di berbagai perusahaan menaikkan versi dari LTS ke LTS, melompati rilis-rilis non-LTS di antaranya. Barisan LTS saat ini: Java 8 (2014), 11 (2018), 17 (2021), 21 (2023), dan 25 (2025); LTS berikutnya direncanakan pada September 2027. Karena hanya LTS yang mendapat dukungan panjang, hampir seluruh proyek produksi berdiri di atas salah satu dari lima versi tersebut.
Lini Masa Dukungan #
Berapa lama sebuah LTS dirawat? Jawabannya bergantung pada siapa yang merawat. Tabel berikut merangkum dua sumber dukungan yang paling sering dirujuk: program Oracle untuk pelanggan berbayar, dan jadwal minimal Eclipse Temurin (distribusi komunitas gratis yang dipakai Course ini):
| Versi | Rilis (GA) | Status | Dukungan Oracle (pelanggan) | Dukungan Temurin (minimal) |
|---|---|---|---|---|
| 8 | Maret 2014 | LTS paling lawas | Extended hingga Desember 2030 | Hingga Desember 2030 |
| 11 | September 2018 | LTS matang | Extended hingga Januari 2032 | Hingga Oktober 2027 |
| 17 | September 2021 | LTS matang | Extended hingga September 2029 | Hingga Oktober 2027 |
| 21 | September 2023 | LTS aktif | Extended hingga September 2031 | Hingga Desember 2029 |
| 25 | September 2025 | LTS terkini | Extended hingga September 2033 | Hingga September 2031 |
Pembacaan tabelnya lugas: Java 8 masih dirawat sampai 2030 karena basis instalasinya sangat besar, sementara Java 25 akan terus menerima perbaikan hingga setidaknya 2031-2033. Semakin baru LTS-nya, semakin lama rentang perawatan yang tersisa untuk proyek baru.
Ragam Distribusi JDK #
Semua distribusi JDK dibangun dari kode sumber yang sama — repositori OpenJDK — sehingga berpindah distribusi umumnya tidak mengubah perilaku program. Pembedanya ada pada siapa yang merakit, kanal dukungan, dan jadwal pembaruan:
| Distribusi | Perakit | Catatan |
|---|---|---|
| Oracle JDK | Oracle | Build resmi Oracle; gratis untuk produksi dengan ketentuan lisensi per rilis |
| Oracle OpenJDK | Oracle | Build murni open source; pembaruan hanya beberapa bulan per rilis |
| Eclipse Temurin | Yayasan Eclipse (Adoptium) | Build komunitas gratis; LTS dirawat bertahun-tahun; dipakai Course ini |
| Amazon Corretto | Amazon | Gratis; jalur dukungan menyatu dengan layanan AWS |
| Azul Zulu | Azul Systems | Gratis; opsi dukungan komersial Azul |
| BellSoft Liberica | BellSoft | Gratis; populer di lingkungan container dan Linux |
| Red Hat Build of OpenJDK | Red Hat | Gratis; jalur dukungan menyatu dengan RHEL |
| GraalVM | Oracle | JDK plus compiler Graal dan kemampuan native image |
Untuk belajar dan kebanyakan proyek, satu distribusi LTS gratis mana pun sudah memadai. Pertimbangkan distribusi vendor tertentu ketika tim Anda membutuhkan kanal dukungan komersial atau integrasi dengan platform tertentu seperti AWS dan RHEL.
Membaca String Versi dari Dalam Program #
Program Java dapat memeriksa versi runtime yang menjalankannya lewat class Runtime.Version. Kemampuan ini berguna untuk alat CLI yang perlu menolak JVM yang terlalu lawas. Program berikut membaca versi lengkap, lalu membandingkannya dengan tiga batas LTS:
public class CekVersiRuntime {
public static void main(String[] args) {
Runtime.Version versi = Runtime.version();
System.out.println("Versi lengkap : " + versi);
System.out.println("Angka feature : " + versi.feature());
Runtime.Version batas17 = Runtime.Version.parse("17");
Runtime.Version batas21 = Runtime.Version.parse("21");
Runtime.Version batas25 = Runtime.Version.parse("25");
System.out.println("Memenuhi Java 17+ : " + (versi.compareTo(batas17) >= 0));
System.out.println("Memenuhi Java 21+ : " + (versi.compareTo(batas21) >= 0));
System.out.println("Memenuhi Java 25+ : " + (versi.compareTo(batas25) >= 0));
}
}Output yang Dihasilkan:
Versi lengkap : 25.0.4.1+1-LTS
Angka feature : 25
Memenuhi Java 17+ : true
Memenuhi Java 21+ : true
Memenuhi Java 25+ : trueMari kita telaah cara kerjanya:
- Baris 4 (
Runtime.Version versi = Runtime.version();): mengambil objek versi dari JVM yang sedang berjalan. Objek ini tahu segmen-segmen versi sampai nomor build. - Baris 6-7 (
versidanversi.feature()): mencetak25.0.4.1+1-LTS. Angka utama 25 adalah feature — penanda generasi rilis;0.4.1adalah pembaruan kuartalan dan patch;+1nomor build; sedangkanLTSadalah penanda opsional yang ditambahkan distribusi Temurin. - Baris 9-11 (
Runtime.Version.parse("17")dst.): membangun objek versi pembanding dari string. Method ini juga dipakai alat build untuk memeriksa versi minimum. - Baris 13-15 (
versi.compareTo(batas17) >= 0): membandingkan dua versi — hasil tidak negatif berarti runtime sama baru atau lebih baru dari batas. Ketiga baris menghasilkantruekarena 25 lebih baru dari 17, 21, dan setara dengan 25.
Rekomendasi untuk Proyek Baru dan Sistem Lawas #
Untuk proyek baru, mulai dari LTS terbaru yang didukung ekosistem Anda. Saat Course ini ditulis, jawaban tersebut adalah Java 25: dukungan panjang, fitur modern seperti record, pattern matching, dan virtual threads, serta jalur perawatan paling panjang. Pilihan kedua yang wajar adalah Java 21 atau 17 jika framework atau library kunci proyek Anda belum menyatakan dukungan untuk 25 — selalu cek halaman dukungan framework sebelum memutuskan. Rilis non-LTS sebaiknya dipakai untuk eksperimen fitur baru, bukan untuk sistem produksi.
Untuk sistem lawas, naik bertahap dari satu LTS ke LTS berikutnya (8 → 11 → 17 → 21 → 25) terbukti lebih terkendali daripada migrasi besar sekali jalan. Alat jdeps dan jdeprscan di folder bin JDK membantu memetakan dependensi API yang sudah dihapus atau tidak dianjurkan. Kunci keberhasilan migrasi bukan kecepatan, melainkan keajekan: seluruh anggota tim dan pipeline CI memakai versi yang sama, terpasang dari distribusi yang sama.
Dengan strategi versi yang jelas, fondasi pengetahuan kita lengkap: kita mengenal Java, sejarahnya, platformnya, cara kerjanya, posisinya di antara bahasa lain, dan cara memilih versinya. Section berikutnya beralih dari teori ke praktik — menyiapkan JDK dan editor di komputer Anda, lalu menjalankan program pertama secara mandiri.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
CekVersiRuntime.java
Unduh berkaspublic class CekVersiRuntime {
public static void main(String[] args) {
Runtime.Version versi = Runtime.version();
System.out.println("Versi lengkap : " + versi);
System.out.println("Angka feature : " + versi.feature());
Runtime.Version batas17 = Runtime.Version.parse("17");
Runtime.Version batas21 = Runtime.Version.parse("21");
Runtime.Version batas25 = Runtime.Version.parse("25");
System.out.println("Memenuhi Java 17+ : " + (versi.compareTo(batas17) >= 0));
System.out.println("Memenuhi Java 21+ : " + (versi.compareTo(batas21) >= 0));
System.out.println("Memenuhi Java 25+ : " + (versi.compareTo(batas25) >= 0));
}
}