Sepanjang Section ini kita membangun fondasi web dengan tangan sendiri: mengurai HTTP, menyimulasikan servlet, mengelola session, merender template. Produksi tidak perlu membangun semuanya manual — komunitas Java sudah membakukan lapisan-lapisan tersebut menjadi satu platform bernama Jakarta EE. Platform ini membakukan servlet, dependency injection, API REST, validasi, hingga template — semuanya lewat spesifikasi tertulis yang diimplementasikan banyak vendor. Chapter ini memetakan isi platform, sejarah singkatnya, dan konsep profile yang menentukan seberapa besar porsi platform yang kita pasang.
Dari J2EE ke Jakarta EE #
Perjalanan nama platform ini panjang: lahir sebagai J2EE pada akhir 1990-an, menjadi Java EE pada 2006, lalu pindah ke Eclipse Foundation pada 2017 dengan nama Jakarta EE. Perpindahan rumah tersebut membawa satu konsekuensi teknis besar yang sudah kita singgung di Chapter Ekosistem Java Web: seluruh nama package berpindah dari javax.* ke jakarta.* mulai versi 9. Versi stabil saat materi ini ditulis adalah Jakarta EE 11, disetujui pertengahan 2025 dengan syarat minimal Java SE 17, sementara Jakarta EE 12 sedang disusun.
Filosofi platformnya tetap sama sejak awal: aplikasi ditulis melawan spesifikasi, bukan melawan produk. Deploy aplikasi .war ke Tomcat, WildFly, atau Open Liberty dilakukan tanpa mengubah kode — persis pola JDBC yang memisahkan API dari driver.
Profil: Inti, Web, dan Penuh #
Mengambil platform lengkap untuk layanan kecil terasa berat, sehingga Jakarta EE menyediakan tiga profile — paket spesifikasi dengan ukuran bertingkat:
| Profil | Sasaran | Isi inti |
|---|---|---|
| Core Profile | layanan mikro kecil | CDI Lite, JSON, REST |
| Web Profile | aplikasi web klasik | Core + Servlet, Pages, Faces, Validation, Persistence |
| Full Platform | aplikasi enterprise utuh | Web + Messaging, Mail, Batch, Connectors |
Setiap profil menjamin aplikasi yang ditulis untuknya berjalan di implementasi kompatibel profil tersebut. WildFly dan Open Liberty menyediakan ketiganya; Tomcat mengimplementasikan porsi spesifikasi milik wadah web.
Spesifikasi Kunci untuk Developer Web #
Dari sudut pandang developer, beberapa spesifikasi anggota platform paling sering disentuh:
| Spesifikasi | Tugas | Package utama |
|---|---|---|
| Jakarta Servlet | pemroses permintaan | jakarta.servlet |
| Jakarta RESTful Web Services | API REST beranotasi | jakarta.ws.rs |
| Jakarta CDI | dependency injection + scope | jakarta.enterprise |
| Jakarta Validation | validasi bean beranotasi | jakarta.validation |
| Jakarta Persistence | ORM ke basis data relasional | jakarta.persistence |
| Jakarta JSON Binding | ubah objek ke JSON dan sebaliknya | jakarta.json.bind |
Chapter Servlet Fundamentals sampai Template Rendering sesungguhnya telah membahas lapisan-lapisan paling bawah dari tabel ini; Jakarta EE “hanya” membakukan dan merapikannya menjadi kontrak resmi.
Membaca Profil sebagai Data #
Daftar isi tiap profil adalah fakta yang paling cepat usang bila dihafal, jadi kita perlakukan sebagai data. PetaJakarta merekam setiap spesifikasi beserta profil terkecil pemiliknya sesuai dokumen spesifikasi Jakarta EE 11, lalu mencetak isi dan jumlah kumulatif tiap profil:
import java.util.List;
public class PetaJakarta {
enum Profil { INTI, WEB, PENUH }
record Spesifikasi(String nama, String versi, Profil profilMinimal) {}
static final List<Spesifikasi> PETA = List.of(
// komponen wajib Jakarta EE 11 Core Profile
new Spesifikasi("Jakarta Annotations", "3.0", Profil.INTI),
new Spesifikasi("Jakarta CDI (bagian Lite)", "4.1", Profil.INTI),
new Spesifikasi("Jakarta Dependency Injection", "2.0", Profil.INTI),
new Spesifikasi("Jakarta Interceptors", "2.2", Profil.INTI),
new Spesifikasi("Jakarta JSON Processing", "2.1", Profil.INTI),
new Spesifikasi("Jakarta JSON Binding", "3.0", Profil.INTI),
new Spesifikasi("Jakarta RESTful Web Services", "4.0", Profil.INTI),
// tambahan wajib Jakarta EE 11 Web Profile
new Spesifikasi("Jakarta Authentication", "3.1", Profil.WEB),
new Spesifikasi("Jakarta Concurrency", "3.1", Profil.WEB),
new Spesifikasi("Jakarta Data", "1.0", Profil.WEB),
new Spesifikasi("Jakarta Debugging Support for Other Languages", "2.0", Profil.WEB),
new Spesifikasi("Jakarta Enterprise Beans Lite", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Expression Language", "6.0", Profil.WEB),
new Spesifikasi("Jakarta Faces", "4.1", Profil.WEB),
new Spesifikasi("Jakarta Pages", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Persistence", "3.2", Profil.WEB),
new Spesifikasi("Jakarta Security", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Servlet", "6.1", Profil.WEB),
new Spesifikasi("Jakarta Standard Tag Library", "3.0", Profil.WEB),
new Spesifikasi("Jakarta Transactions", "2.0", Profil.WEB),
new Spesifikasi("Jakarta Validation", "3.1", Profil.WEB),
new Spesifikasi("Jakarta WebSocket", "2.2", Profil.WEB),
// tambahan hanya pada Jakarta EE 11 Full Platform
new Spesifikasi("Jakarta Authorization", "-", Profil.PENUH),
new Spesifikasi("Jakarta Batch", "-", Profil.PENUH),
new Spesifikasi("Jakarta Connectors", "-", Profil.PENUH),
new Spesifikasi("Jakarta Enterprise Beans (penuh)", "-", Profil.PENUH),
new Spesifikasi("Jakarta Mail", "-", Profil.PENUH),
new Spesifikasi("Jakarta Messaging", "-", Profil.PENUH));
public static void main(String[] args) {
System.out.println("== Spesifikasi per profil (profil terkecil pemiliknya) ==");
for (Profil profil : Profil.values()) {
System.out.println();
System.out.println("[" + profil + "]");
PETA.stream()
.filter(s -> s.profilMinimal() == profil)
.forEach(s -> System.out.printf(" %-48s %s%n", s.nama(), s.versi()));
}
System.out.println();
System.out.println("== Jumlah kumulatif isi tiap profil ==");
int inti = 0, web = 0, penuh = 0;
for (Spesifikasi s : PETA) {
switch (s.profilMinimal()) {
case INTI -> inti++;
case WEB -> web++;
case PENUH -> penuh++;
}
}
System.out.println("Core Profile : " + inti + " spesifikasi");
System.out.println("Web Profile : " + (inti + web) + " spesifikasi (7 + " + web + ")");
System.out.println("Full Platform : " + (inti + web + penuh)
+ " spesifikasi (22 + " + penuh + ")");
}
}Output yang Dihasilkan:
== Spesifikasi per profil (profil terkecil pemiliknya) ==
[INTI]
Jakarta Annotations 3.0
Jakarta CDI (bagian Lite) 4.1
Jakarta Dependency Injection 2.0
Jakarta Interceptors 2.2
Jakarta JSON Processing 2.1
Jakarta JSON Binding 3.0
Jakarta RESTful Web Services 4.0
[WEB]
Jakarta Authentication 3.1
Jakarta Concurrency 3.1
Jakarta Data 1.0
Jakarta Debugging Support for Other Languages 2.0
Jakarta Enterprise Beans Lite 4.0
Jakarta Expression Language 6.0
Jakarta Faces 4.1
Jakarta Pages 4.0
Jakarta Persistence 3.2
Jakarta Security 4.0
Jakarta Servlet 6.1
Jakarta Standard Tag Library 3.0
Jakarta Transactions 2.0
Jakarta Validation 3.1
Jakarta WebSocket 2.2
[PENUH]
Jakarta Authorization -
Jakarta Batch -
Jakarta Connectors -
Jakarta Enterprise Beans (penuh) -
Jakarta Mail -
Jakarta Messaging -
== Jumlah kumulatif isi tiap profil ==
Core Profile : 7 spesifikasi
Web Profile : 22 spesifikasi (7 + 15)
Full Platform : 28 spesifikasi (22 + 6)Bedah struktur program ini:
- Baris 5 (
enum Profil): urutan konstanta enum (INTI,WEB,PENUH) menentukan urutanvalues()— output otomatis terurut dari profil terkecil tanpa perlu pengurutan tambahan. - Baris 9-40 (
List<Spesifikasi> PETA): data direkam sebagai daftar immutable. Nilai"-"pada kelompok Full Platform menyatakan versi tidak dipatok di program ini — nomor profil pemiliknya yang menentukan kompatibilitas, bukan nomor versinya. - Baris 47-49 (
filter+printf): satu daftar data disaring tiga kali untuk tiga profil. Format%-48smeratakan kolom nama agar tabel rapi meski nama spesifikasi panjangnya beragam. - Baris 54-65 (hitungan kumulatif): angka Core 7, Web 22, Full 28 menegaskan relasi bersarang: setiap profil lebih besar memuat seluruh isi profil di bawahnya. Menulis aplikasi untuk Core Profile berarti aplikasi itu otomatis kompatibel dengan Web Profile dan Full Platform.
Melihat ke Dalam CDI #
Dari seluruh spesifikasi pada peta di atas, satu nama muncul terus-menerus dalam pengembangan aplikasi modern: Jakarta CDI, mesin dependency injection milik platform. Servlet menyediakan request, REST menyediakan endpoint, Persistence menyediakan repository — CDI yang merangkai semuanya menjadi aplikasi utuh. Sebelum melangkah ke pembangunan REST API, kita pelajari cara kerja perangkai tersebut pada Chapter Dependency Injection di Web Apps.
Referensi #
- Jakarta EE Platform 11 Specification
- Jakarta EE Web Profile 11 Specification
- About Jakarta EE
- Jakarta CDI 4.1 Specification
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
PetaJakarta.java
Unduh berkasimport java.util.List;
public class PetaJakarta {
enum Profil { INTI, WEB, PENUH }
record Spesifikasi(String nama, String versi, Profil profilMinimal) {}
static final List<Spesifikasi> PETA = List.of(
// komponen wajib Jakarta EE 11 Core Profile
new Spesifikasi("Jakarta Annotations", "3.0", Profil.INTI),
new Spesifikasi("Jakarta CDI (bagian Lite)", "4.1", Profil.INTI),
new Spesifikasi("Jakarta Dependency Injection", "2.0", Profil.INTI),
new Spesifikasi("Jakarta Interceptors", "2.2", Profil.INTI),
new Spesifikasi("Jakarta JSON Processing", "2.1", Profil.INTI),
new Spesifikasi("Jakarta JSON Binding", "3.0", Profil.INTI),
new Spesifikasi("Jakarta RESTful Web Services", "4.0", Profil.INTI),
// tambahan wajib Jakarta EE 11 Web Profile
new Spesifikasi("Jakarta Authentication", "3.1", Profil.WEB),
new Spesifikasi("Jakarta Concurrency", "3.1", Profil.WEB),
new Spesifikasi("Jakarta Data", "1.0", Profil.WEB),
new Spesifikasi("Jakarta Debugging Support for Other Languages", "2.0", Profil.WEB),
new Spesifikasi("Jakarta Enterprise Beans Lite", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Expression Language", "6.0", Profil.WEB),
new Spesifikasi("Jakarta Faces", "4.1", Profil.WEB),
new Spesifikasi("Jakarta Pages", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Persistence", "3.2", Profil.WEB),
new Spesifikasi("Jakarta Security", "4.0", Profil.WEB),
new Spesifikasi("Jakarta Servlet", "6.1", Profil.WEB),
new Spesifikasi("Jakarta Standard Tag Library", "3.0", Profil.WEB),
new Spesifikasi("Jakarta Transactions", "2.0", Profil.WEB),
new Spesifikasi("Jakarta Validation", "3.1", Profil.WEB),
new Spesifikasi("Jakarta WebSocket", "2.2", Profil.WEB),
// tambahan hanya pada Jakarta EE 11 Full Platform
new Spesifikasi("Jakarta Authorization", "-", Profil.PENUH),
new Spesifikasi("Jakarta Batch", "-", Profil.PENUH),
new Spesifikasi("Jakarta Connectors", "-", Profil.PENUH),
new Spesifikasi("Jakarta Enterprise Beans (penuh)", "-", Profil.PENUH),
new Spesifikasi("Jakarta Mail", "-", Profil.PENUH),
new Spesifikasi("Jakarta Messaging", "-", Profil.PENUH));
public static void main(String[] args) {
System.out.println("== Spesifikasi per profil (profil terkecil pemiliknya) ==");
for (Profil profil : Profil.values()) {
System.out.println();
System.out.println("[" + profil + "]");
PETA.stream()
.filter(s -> s.profilMinimal() == profil)
.forEach(s -> System.out.printf(" %-48s %s%n", s.nama(), s.versi()));
}
System.out.println();
System.out.println("== Jumlah kumulatif isi tiap profil ==");
int inti = 0, web = 0, penuh = 0;
for (Spesifikasi s : PETA) {
switch (s.profilMinimal()) {
case INTI -> inti++;
case WEB -> web++;
case PENUH -> penuh++;
}
}
System.out.println("Core Profile : " + inti + " spesifikasi");
System.out.println("Web Profile : " + (inti + web) + " spesifikasi (7 + " + web + ")");
System.out.println("Full Platform : " + (inti + web + penuh)
+ " spesifikasi (22 + " + penuh + ")");
}
}