Saya memiliki beberapa kode yang menggunakan kelas API JAXB yang telah disediakan sebagai bagian dari JDK di Java 6/7/8. Ketika saya menjalankan kode yang sama dengan Java 9, saat runtime saya mendapatkan kesalahan yang menunjukkan bahwa kelas JAXB tidak dapat ditemukan.
Kelas JAXB telah disediakan sebagai bagian dari JDK sejak Java 6, jadi mengapa Java 9 tidak lagi menemukan kelas-kelas ini?
Jawaban:
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:
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:JDK_JAVA_OPTIONS
variabel lingkungan. Variabel lingkungan ini secara otomatis dibaca olehjava
peluncur untuk Java 9+.-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. Thejava.se.ee
modul modul agregat yang mencakupjava.se.ee
serta di atas Java EE API modul. Catatan, ini tidak berfungsi di Java 11 karenajava.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:
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 :sumber
javax.xml.bind
dan kelas JavaEE lainnya dijadwalkan untuk dihapus di Jawa 11, per JEP-320 .java.se.ee
modul telah dihapus, sehingga--add-modules
solusinya tidak berfungsi lagi. Gunakan solusi yang disarankan sebagai gantinya: tambahkan JAXB sebagai ketergantungan terpisah.Dalam kasus saya (spring boot fat jar) saya hanya menambahkan yang berikut ini ke pom.xml.
sumber
testCompile('javax.xml.bind:jaxb-api')
berhasil untuk saya.<scope>runtime</scope>
untuk kasus seperti ituTidak ada solusi ini yang bekerja dengan baik untuk saya di JDK 9.0.1 baru-baru ini.
Saya menemukan bahwa daftar dependensi ini cukup untuk berfungsi dengan baik, jadi Anda tidak perlu menentukan secara eksplisit
--add-module
(meskipun ditentukan dalam pom dependensi ini). Satu-satunya yang Anda butuhkan adalah menentukan daftar dependensi ini:sumber
pom.xml
file konfigurasi Maven. Jika Anda tidak tahu apa itu, maka lebih baik mulai dari awal<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
dependensi terakhir.Ini bekerja untuk saya:
Memperbarui
Seperti yang disarankan @Jasper, untuk menghindari ketergantungan pada seluruh pustaka EclipseLink, Anda juga bisa bergantung pada EclipseLink MOXy:
Maven
Gradle
Sebagai dependensi untuk aplikasi Java 8 saya, yang menghasilkan * .jar yang dapat dijalankan oleh JRE 8 atau JRE 9 tanpa argumen tambahan.
Selain itu, ini perlu dijalankan di suatu tempat sebelum JAXB API akan digunakan:
Bekerja sangat baik sejauh ini, sebagai solusi. Tidak terlihat seperti solusi sempurna ...
sumber
org.eclipse.persistence:eclipselink
hanya untuk mendapatkan API JAXB adalah ketergantungan yang sangat berat, kecuali Anda sudah menggunakan eclipselink?-XX:+IgnoreUnrecognizedVMOptions
opsi baris perintah (memperbarui jawaban saya dengan detail)org.eclipse.persistence
, artifactIdorg.eclipse.persistence.moxy
.solusi bersih untuk semua JDK> = 9
Anda perlu menambahkan dua dependensi ke bangunan Anda
Sebagai implementasi saya memilih untuk menggunakan implementasi referensi oleh GlassFish untuk menyingkirkan kelas / perpustakaan com.sun tua. Jadi sebagai hasilnya saya menambahkan maven build saya
Perhatikan bahwa dari versi 2.3.1 Anda tidak perlu menambahkan javax.activation lagi. (lihat https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
sumber
itu karena versi java jika Anda menggunakan jdk 9 atau versi yang lebih baru tambahkan saja ini ke pom Anda
sumber
Untuk mengatasi ini, saya telah mengimpor beberapa file JAR di proyek saya:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
sumber
com.sun.xml.bind
artefak sudah tua dan disediakan hanya untuk kompatibilitas mundur. Anda harus menggunakanorg.glassfish.jaxb
artefak yang setara sebagai gantinya, sebagaimana disebutkan dalam beberapa jawaban lainnya.Pada saat kompilasi dan juga waktu menjalankan, tambahkan sakelar
--add-modules java.xml.bind
Pengenalan
JDK 9
modul yang baik juga dapat ditemukan di: https://www.youtube.com/watch?v=KZfbRuvv5qcsumber
Ini berhasil untuk saya. Menambahkan jaxb-api saja tidak cukup.
sumber
com.sun.xml.bind
artefak sudah tua dan disediakan hanya untuk kompatibilitas mundur. Anda harus menggunakanorg.glassfish.jaxb
artefak yang setara sebagai gantinya, sebagaimana disebutkan dalam beberapa jawaban lainnya.Pergi ke Build.gradle Anda dan tambahkan dependensi di bawah ini untuk Java 9 atau Java 10.
sumber
Anda dapat menggunakan
--add-modules=java.xml.bind
opsi JVM untuk menambahkan modul bind xml ke lingkungan run-time JVM.Misalnya:
java --add-modules=java.xml.bind XmlTestClass
sumber
Perbarui April 2019
Changelong untuk rilis JAXB ada di https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
kutipan:
Tautan resmi ada di https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 menarik:
Jawaban Asli
Mengikuti artefak mana yang harus saya gunakan untuk JAXB RI dalam proyek Maven saya? di Maven, Anda dapat menggunakan profil seperti:
Pohon ketergantungan menunjukkan:
Untuk menggunakan ini di Eclipse, katakan Oxygen.3a Release (4.7.3a) atau lebih baru, Ctrl-Alt-P, atau klik kanan pada proyek, Maven, lalu pilih profil.
sumber
javax.xml.bind
>jaxb-api
yang saya lihat di tempat lain sebenarnya berlebihan. Ketergantungan glassfish menariknya. Saya baru saja mencobanya, dan itu memang berhasil.Untuk Java Web Start Execution, kami dapat menggunakan saran Andy Guibert seperti ini:
Catat ekstra "=" di --add-modules. Lihat Tiket OpenJDK ini atau catatan terakhir dalam "Memahami Peringatan Akses Runtime" dari Platform Java, Edisi Standar Panduan Migrasi Oracle JDK 9 .
sumber
tambahkan javax.xml.bind dependensi di pom.xml
sumber
Karena JavaEE sekarang diperintah oleh https://jakarta.ee/ , koordinat Maven baru pada 2.3.2 adalah:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
Versi jaxb.versi pertama yang dirilis adalah 2.3.2.
sumber
Saya mengikuti URL ini dan pengaturan di bawah ini benar-benar membantu saya. Saya menggunakan Java 10 dengan STS IDE di Macbook Pro. Itu bekerja seperti pesona.
sumber
Ini memecahkan masalah saya dengan dependensi yang menjalankan Apache Camel 2.24.1 di Java 12:
sumber
Saya mengalami masalah yang sama menggunakan Spring Boot
2.0.5.RELEASE
di Java 11.Menambahkan
javax.xml.bind:jaxb-api:2.3.0
sendiri tidak memperbaiki masalah. Saya juga harus memperbarui Spring Boot ke Milestone terbaru2.1.0.M2
, jadi saya menganggap ini akan diperbaiki dalam rilis resmi berikutnya.sumber
Anda perlu menambahkan dependensi JAX-B saat menggunakan JDK 9+. Untuk Android Studio pengguna, Anda harus menambahkan ini ke Anda
build.gradle
'sdependencies {}
blok:sumber
Saya juga ragu-ragu melintasi ClassNotFoundException: javax.xml.bind.DatatypeConverter menggunakan Java 11 dan
Saya mencoba semua ini dengan menambahkan javax.xml.bind: jaxb-api atau spring boot jakarta.xml.bind-api .. Saya menemukan petunjuk untuk perbaikan di jjwt versi 0.10.0 .. tetapi yang paling penting, paket jjwt adalah sekarang terbelah!
Jadi, periksa referensi ini: https://github.com/jwtk/jjwt/issues/510
Cukup, jika Anda gunakan
pergi untuk
jjwt versi 0.11.x, tetapi gunakan paket terpisah: https://github.com/jwtk/jjwt#install
Anda tidak akan menemukan versi yang lebih tinggi untuk ketergantungan jjwt, karena mereka membagi paket.
Bersulang.
sumber
Bukan jawaban, tetapi tambahan: Saya dapatkan karena menjalankan
groovysh
(Groovy 2.4.13) jika JAVA_HOME menunjuk ke instalasi Java 9 (java version "9.0.1"
lebih tepatnya) gagal secara luar biasa:Solusinya adalah:
Buka Proyek JAXB di github.io ( "JAXB dilisensikan dengan lisensi ganda - CDDL 1.1 dan GPL 2.0 dengan Pengecualian jalur-kelas" )
Unduh
jaxb-ri-2.3.0.zip
Unzip di mana pun Anda meletakkan file infrastruktur java Anda (dalam kasus saya,
/usr/local/java/jaxb-ri/
). Solusi lain mungkin ada (mungkin melalui SDKMAN, saya tidak tahu)Pastikan toples di subdirektori lib ada di
CLASSPATH
. Saya melakukannya melalui skrip yang dimulai pada bash startup, dipanggil/etc/profile.d/java.sh
, tempat saya menambahkan (di antara banyak baris lain) loop berikut:Dikemas ke dalam fungsi ...
Dan itu berhasil!
sumber
Anda hanya perlu 1 ketergantungan:
sumber
OK, saya mengalami masalah yang sama, tetapi saya menggunakan Java 8, dan terus mendapatkan kesalahan ini, saya mencoba sebagian besar solusi. tetapi ternyata pakar saya masih menunjuk ke java 9 walaupun saya mengatur versi Java global ke 8, segera setelah saya perbaiki semuanya bekerja.
Untuk siapa saja yang mungkin memiliki masalah seperti ini, lihat Cara memperbaiki Maven untuk menggunakan Java default
sumber
Jawaban lama "Masalah teratasi dengan beralih ke amazoncorretto" Berita jawaban: Saya menggunakan corretto terbaru, tetapi serupa jdk 1.8. jadi bagaimanapun kita perlu menambahkan dependensi secara manual
sumber
amazoncorretto:latest
saat ini memberikan JDK 8, bukan 11. Banyak gambar Docker masih didasarkan pada JDK 8, justru karena masalah kompatibilitas yang disebabkan oleh penghapusan API antara JDK 8 -> 11Versi ketergantungan yang perlu saya gunakan saat mengkompilasi target Java 8. Aplikasi yang diuji di Java 8, 11, dan 12 JRE.
sumber
Bagi saya di Java 11 dan gradle inilah yang berhasil:
sumber
Anda perlu menambahkan dependance jaxb ke pakar. Implementasi glassfish versi 2.3.2 sangat kompatibel dengan jakarta baru EE jaxb api versi 2.3.2.
sumber
Saya memiliki masalah serupa setelah memutakhirkan proyek saya ke java 11, lalu apa yang diperbaiki adalah meningkatkan ke boot semi 2.1.1 yang tampaknya memiliki dukungan untuk java 11, ini membantu
sumber
Saya tahu saya terlambat ke pesta, tetapi kesalahan saya akhirnya membutuhkan solusi yang berbeda ... super sederhana juga
Saya awalnya dideportasi ke Tomcat 9 dan menyadari saya membutuhkan 7 ... Saya lupa memetakan jalur kelas saya kembali ke versi 7 di build.xml
Semoga ini akan memperbaiki kesalahan elses seseorang di masa depan, yang berhasil mengabaikan masalah sederhana ini seperti yang saya lakukan!
sumber
Jika Anda memanggil layanan web SOAP (misalnya, menggunakan
jaxws-maven-plugin
) hanya dengan menambahkan dependensi ini semua kesalahan JAXB hilang:Diuji dengan Java 13
sumber