API JAXB dianggap Java EE API dan karenanya tidak lagi terkandung pada classpath default di Java SE 9. Di Java 11, mereka sepenuhnya dihapus dari JDK.
Java 9 memperkenalkan konsep-konsep modul, dan secara default, java.se
modul agregat tersedia di classpath (atau lebih tepatnya, jalur-modul). Sesuai namanya, java.se
modul agregat tidak termasuk Java EE API yang secara tradisional digabungkan dengan Java 6/7/8.
Untungnya, Java EE APIs yang disediakan di JDK 6/7/8 masih ada di JDK, tetapi secara default mereka tidak ada di classpath. API EE Java tambahan disediakan dalam modul berikut:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Solusi cepat dan kotor: (hanya JDK 9/10)
Untuk membuat API JAXB tersedia saat runtime, tentukan opsi baris perintah berikut:
--add-modules java.xml.bind
Tapi saya masih membutuhkan ini untuk bekerja dengan Java 8 !!!
Jika Anda mencoba menentukan --add-modules
dengan JDK yang lebih lama, itu akan meledak karena itu adalah opsi yang tidak dikenal. Saya menyarankan satu dari dua opsi:
- Anda dapat mengatur opsi Java 9+ saja menggunakan
JDK_JAVA_OPTIONS
variabel lingkungan. Variabel lingkungan ini secara otomatis dibaca oleh java
peluncur untuk Java 9+.
- Anda dapat menambahkan
-XX:+IgnoreUnrecognizedVMOptions
untuk membuat JVM secara diam-diam mengabaikan opsi yang tidak dikenal, alih-alih meledak. Tapi waspadalah! Argumen baris perintah apa pun yang Anda gunakan tidak akan lagi divalidasi untuk Anda oleh JVM. Opsi ini berfungsi dengan Oracle / OpenJDK serta IBM JDK (pada JDK 8sr4).
Alternatif solusi cepat: (khusus JDK 9/10)
Perhatikan bahwa Anda dapat membuat semua modul Java EE di atas tersedia pada saat dijalankan dengan menentukan --add-modules java.se.ee
opsi. The java.se.ee
modul modul agregat yang mencakup java.se.ee
serta di atas Java EE API modul. Catatan, ini tidak berfungsi di Java 11 karena java.se.ee
dihapus di Java 11.
Solusi jangka panjang yang tepat: (JDK 9 dan lebih tinggi)
Modul Java EE API yang tercantum di atas semuanya ditandai @Deprecated(forRemoval=true)
karena dijadwalkan untuk dihapus di Java 11 . Jadi --add-module
pendekatan ini tidak lagi berfungsi di Java 11 out-of-the-box.
Apa yang perlu Anda lakukan di Java 11 dan meneruskan adalah memasukkan salinan Java EE API Anda sendiri di jalur kelas atau modul. Misalnya, Anda dapat menambahkan API JAX-B sebagai ketergantungan Maven seperti ini:
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Lihat halaman Implementasi Referensi JAXB untuk detail lebih lanjut tentang JAXB.
Untuk detail lengkap tentang modularitas Java, lihat JEP 261: Modul System
Untuk pengembang Gradle atau Android Studio: (JDK 9 dan lebih tinggi)
Tambahkan dependensi berikut ke build.gradle
file Anda :
dependencies {
// JAX-B dependencies for JDK 9+
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}