Cara mengatasi java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException di Java 9


845

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?


2
Bagian tambahan dalam jawaban ini berkaitan dengan migrasi API ini.
Naman

7
membangun dengan Java 8 akan membuat kode Anda untuk dikompilasi ya, tetapi ketika Anda mencoba menjalankan kode yang dikompilasi di Java 9+ itu akan gagal karena JAX-B tidak ada.
Andy Guibert

1
Untuk Java 11, solusi artikel ini adalah yang terbaru: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

Jawaban:


1225

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.semodul agregat tersedia di classpath (atau lebih tepatnya, jalur-modul). Sesuai namanya, java.semodul 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-modulesdengan JDK yang lebih lama, itu akan meledak karena itu adalah opsi yang tidak dikenal. Saya menyarankan satu dari dua opsi:

  1. Anda dapat mengatur opsi Java 9+ saja menggunakan JDK_JAVA_OPTIONSvariabel lingkungan. Variabel lingkungan ini secara otomatis dibaca oleh javapeluncur untuk Java 9+.
  2. Anda dapat menambahkan -XX:+IgnoreUnrecognizedVMOptionsuntuk 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.eeopsi. The java.se.eemodul modul agregat yang mencakup java.se.eeserta di atas Java EE API modul. Catatan, ini tidak berfungsi di Java 11 karena java.se.eedihapus 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-modulependekatan 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.gradlefile 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"
}

8
Jadi jika modul Java EE API ditandai sudah tidak digunakan lagi, apakah itu berarti kemungkinan di Java 10 JAXB tidak akan lagi tersedia saat runtime di Java 10? Itu sepertinya langkah mundur. Kami harus kembali ke praktik pra-6 dengan menyertakan JAXB sebagai ketergantungan.
Michael

4
Menggunakan --add-modules java.se.ee atau --add-modules ALL-SYSTEM sebagai solusi tidak disarankan sesuai dengan panduan migrasi di sini docs.oracle.com/javase/9/migrate di bawah bagian Modul Dibagikan dengan Java EE Tidak Diselesaikan secara Default -> point 1
justMe

6
Dengan Java 10 dirilis secara resmi, kami dapat mengonfirmasi bahwa metode modul tambahan akan tetap berfungsi. The javax.xml.binddan kelas JavaEE lainnya dijadwalkan untuk dihapus di Jawa 11, per JEP-320 .
Joep Weijers

10
Dan sekarang Java 11 dirilis dan java.se.eemodul telah dihapus, sehingga --add-modulessolusinya tidak berfungsi lagi. Gunakan solusi yang disarankan sebagai gantinya: tambahkan JAXB sebagai ketergantungan terpisah.
Jesper

11
Saya telah menambahkan dependensi ini dan masih memberi saya kesalahan yang sama. ada ide kenapa?
João Vieira

262

Dalam kasus saya (spring boot fat jar) saya hanya menambahkan yang berikut ini ke pom.xml.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>


9
Menambahkan ketergantungan gradle seperti ini testCompile('javax.xml.bind:jaxb-api')berhasil untuk saya.
pamcevoy

5
Seperti @pamcevoy yang disebutkan, tidak perlu menentukan versi jaxb-api saat menggunakan Spring Boot. Boot mengelola versi secara otomatis.
Marcel Overdijk

2
Saya sarankan untuk menggunakan <scope>runtime</scope>untuk kasus seperti itu
VladS

5
Tautan @ Tuno tidak berfungsi untuk saya, tautan tetap adalah: github.com/spring-projects/spring-boot/wiki/…
Francisco Mateo

69

Tidak 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:

<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

2
Untuk JDK 8, lepaskan jaxb-core dan jaxb-impl dari atas.
foo

3
@ Semua ini adalah pom.xmlfile konfigurasi Maven. Jika Anda tidak tahu apa itu, maka lebih baik mulai dari awal
Andremoniy

8
Operasi akses reflektif ilegal telah terjadi. PERINGATAN: Akses reflektif ilegal oleh com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file: / C: / Pengguna / eis /.m2/repository/com/sun/ xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) ke metode java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) PERINGATAN: Harap pertimbangkan melaporkan ini ke pengelola com.sun.xml.bind.v2.runtime.reflect.opt.Injector PERINGATAN: Gunakan --illegal-access = beri peringatan untuk mengaktifkan peringatan operasi akses reflektif ilegal lebih lanjut PERINGATAN: Semua operasi akses ilegal akan menjadi ditolak dalam rilis mendatang
Stefan

1
Ini bekerja untuk saya di JDK 9.0.4 (saya memanggil kode terkait JAXB melalui plugin Maven dengan Maven 3.5.3). Meskipun saya akan menggunakan <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>dependensi terakhir.
scrutari

1
Luar biasa. Saya memiliki situasi di mana - untuk beberapa alasan - aplikasi boot musim semi akan berjalan di intellij CE tetapi tidak gerhana di mac, dan di gerhana tetapi tidak intellij CE di win10. Mampu bekerja dalam satu IDE pada dua platform adalah keuntungan.
kometen

42

Ini bekerja untuk saya:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.7.0</version>
</dependency>

Memperbarui

Seperti yang disarankan @Jasper, untuk menghindari ketergantungan pada seluruh pustaka EclipseLink, Anda juga bisa bergantung pada EclipseLink MOXy:

Maven

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>2.7.3</version>
</dependency>

Gradle

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'

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:

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

Bekerja sangat baik sejauh ini, sebagai solusi. Tidak terlihat seperti solusi sempurna ...


5
menambahkan org.eclipse.persistence:eclipselinkhanya untuk mendapatkan API JAXB adalah ketergantungan yang sangat berat, kecuali Anda sudah menggunakan eclipselink?
Andy Guibert

4
Ya itu berat (~ 9mb) dan ya saya sudah menggunakan itu. Saya telah menyebutkan bahwa ini hanyalah solusi alternatif bagi mereka yang, mungkin sementara, harus menggunakan 8 dan 9 JRE untuk jar / perang yang sama tanpa memberikan argumen baris perintah.
Mikhail Kholodkov

2
demi interop antara JDK 8 & 9, saya akan merekomendasikan menggunakan -XX:+IgnoreUnrecognizedVMOptionsopsi baris perintah (memperbarui jawaban saya dengan detail)
Andy Guibert

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); tidak bekerja untuk saya
David Brossard

1
Untuk menghindari bergantung pada seluruh pustaka EclipseLink, Anda juga bisa hanya bergantung pada EclipseLink MOXy: groupId org.eclipse.persistence, artifactId org.eclipse.persistence.moxy.
Jesper

36

solusi bersih untuk semua JDK> = 9

Anda perlu menambahkan dua dependensi ke bangunan Anda

  • jaxb-api
  • implementasi jaxb

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

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

Perhatikan bahwa dari versi 2.3.1 Anda tidak perlu menambahkan javax.activation lagi. (lihat https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )


Apakah modul javax.xml.bind benar-benar diperlukan? Kode saya di JDK 11 berfungsi tanpanya.
k.liakos

@ k.liakos saya tidak yakin. Jar jaxb-runtime dan api-jar tidak berbagi kelas / paket yang sama. Saya kira itu tergantung pada kode Anda. Jika kode Anda tidak menggunakan kelas-kelas dari paket 'javax.xml.bind' maka Anda mungkin tidak membutuhkannya. Topik utas ini adalah bahwa 'javax / xml / bind / JAXBException' tidak dapat ditemukan; kelas ini hanya ada di jaxb-api.
Sebastian Thees

1
Berfungsi sempurna dengan proyek multi-modul di java 12.
Heril Muratovic

35

itu karena versi java jika Anda menggunakan jdk 9 atau versi yang lebih baru tambahkan saja ini ke pom Anda

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

1
Saya mengalami ini sepanjang waktu dengan panduan Boot Spring ... Terima kasih banyak.
masterxilo

2
@ Cesar Rodriguez T, saya mencoba ini dengan contoh angkuh dan kompilasi bekerja tetapi berjalan memberi kesalahan. Saya menggunakan jawaban yang dipilih yang mencakup lebih banyak dependensi dan yang berfungsi.
PatS

Pada file pom.xml proyek Anda
Cesar Rodriguez T

22

Untuk mengatasi ini, saya telah mengimpor beberapa file JAR di proyek saya:

  • javax.activation-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • jaxb-api-2.3.0.jar

http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • jaxb-core-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

  • jaxb-impl-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

  1. Unduh file di atas dan salin ke folder libs di proyek
  2. Tambahkan file JAR yang diimpor di Java Build Path

4
Perhatikan bahwa com.sun.xml.bindartefak sudah tua dan disediakan hanya untuk kompatibilitas mundur. Anda harus menggunakan org.glassfish.jaxbartefak yang setara sebagai gantinya, sebagaimana disebutkan dalam beberapa jawaban lainnya.
Jesper

Ini tidak berhasil untuk saya. Itu melemparkan kesalahan, dan mengatakan bahwa itu tidak dapat menemukan kelas tertentu.
RamenChef

Bekerja untuk saya ketika saya meletakkannya di folder tomcat9 / lib di bawah Mint 19.2 (basis Ubuntu 18.04), ketika menggunakan aplikasi Grails 3.4.10.
Mohamad Fakih

18

Pada saat kompilasi dan juga waktu menjalankan, tambahkan sakelar --add-modules java.xml.bind

javac --add-modules java.xml.bind <java file name>

java --add-modules java.xml.bind <class file>

Pengenalan JDK 9modul yang baik juga dapat ditemukan di: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

Ini berhasil untuk saya. Menambahkan jaxb-api saja tidak cukup.

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>

Dan untuk apa jaxb-api.versi diatur?
MiguelMunoz

@MiguelMunoz I menggunakan 2.2.7
Mr Jedi

2
Perhatikan bahwa com.sun.xml.bindartefak sudah tua dan disediakan hanya untuk kompatibilitas mundur. Anda harus menggunakan org.glassfish.jaxbartefak yang setara sebagai gantinya, sebagaimana disebutkan dalam beberapa jawaban lainnya.
Jesper

11

Pergi ke Build.gradle Anda dan tambahkan dependensi di bawah ini untuk Java 9 atau Java 10.

sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 

//java 9+ does not have Jax B Dependents

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
    compile group: 'javax.activation', name: 'activation', version: '1.1.1'

11

Anda dapat menggunakan --add-modules=java.xml.bindopsi JVM untuk menambahkan modul bind xml ke lingkungan run-time JVM.

Misalnya: java --add-modules=java.xml.bind XmlTestClass


11

Perbarui April 2019

Changelong untuk rilis JAXB ada di https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

kutipan:

    4.1. Changes between 2.3.0.1 and 2.4.0

         JAXB RI is now JPMS modularized:

            All modules have native module descriptor.

            Removed jaxb-core module, which caused split package issue on JPMS.

            RI binary bundle now has single jar per dependency instead of shaded fat jars.

            Removed runtime class weaving optimization.

    4.2. Changes between 2.3.0 and 2.3.0.1

          Removed legacy technology dependencies:

            com.sun.xml.bind:jaxb1-impl

            net.java.dev.msv:msv-core

            net.java.dev.msv:xsdlib

            com.sun.xml.bind.jaxb:isorelax

    4.3. Changes between 2.2.11 and 2.3.0

          Adopt Java SE 9:

            JAXB api can now be loaded as a module.

            JAXB RI is able to run on Java SE 9 from the classpath.

            Addes support for java.util.ServiceLoader mechanism.

            Security fixes

Tautan resmi ada di https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Maven koordinat untuk artefak JAXB

jakarta.xml.bind: jakarta.xml.bind-api: Kelas API untuk JAXB. Diperlukan untuk dikompilasi melawan JAXB.

org.glassfish.jaxb: jaxb-runtime: Implementasi JAXB, runtime digunakan untuk serialisasi dan deserialisasi objek java ke / dari xml.

Bundel jar lemak JAXB:

com.sun.xml.bind: jaxb-impl: JAXB runtime fat jar.

Berbeda dengan artefak org.glassfish.jaxb, guci ini memiliki semua kelas ketergantungan yang termasuk di dalamnya. Artefak ini tidak mengandung deskriptor modul JPMS. Dalam proyek Maven, artefak org.glassfish.jaxb seharusnya digunakan sebagai gantinya.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 menarik:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile

Jawaban Asli

Mengikuti artefak mana yang harus saya gunakan untuk JAXB RI dalam proyek Maven saya? di Maven, Anda dapat menggunakan profil seperti:

<profile>
    <id>java-9</id>
    <activation>
        <jdk>9</jdk>
    </activation>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</profile> 

Pohon ketergantungan menunjukkan:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile

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.


Terima kasih telah menunjukkan bahwa ketergantungan untuk javax.xml.bind> jaxb-apiyang saya lihat di tempat lain sebenarnya berlebihan. Ketergantungan glassfish menariknya. Saya baru saja mencobanya, dan itu memang berhasil.
Basil Bourque


8

tambahkan javax.xml.bind dependensi di pom.xml

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

8

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.

<properties>
  <jaxb.version>2.3.2</jaxb.version>
</properties>

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>${jaxb.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb.version}</version>
</dependency>

7

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.

   <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

7

Ini memecahkan masalah saya dengan dependensi yang menjalankan Apache Camel 2.24.1 di Java 12:

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0.1</version>
    </dependency>

dalam kasus saya, saya perlu menambahkan ketergantungan kucing jantan dalam file pom
GvSharma

6

Saya mengalami masalah yang sama menggunakan Spring Boot 2.0.5.RELEASE di Java 11.

Menambahkan javax.xml.bind:jaxb-api:2.3.0sendiri tidak memperbaiki masalah. Saya juga harus memperbarui Spring Boot ke Milestone terbaru 2.1.0.M2, jadi saya menganggap ini akan diperbaiki dalam rilis resmi berikutnya.


Ini kedengarannya tidak berhubungan dengan saya. ada beberapa solusi di utas ini yang berfungsi terlepas dari menggunakan spring boot 2. (Saya juga menggunakan spring boot 2.0.5.RELEASE btw). Mungkin di Spring 2.1.0.M2 sudah ada runtime jaxb termasuk.
Sebastian Thees

Tampaknya dengan Spring Boot 2.1.0.RELEASE, JAXB tidak diperlukan lagi - github.com/spring-projects/spring-boot/releases
Burrich

5

Anda perlu menambahkan dependensi JAX-B saat menggunakan JDK 9+. Untuk Android Studio pengguna, Anda harus menambahkan ini ke Anda build.gradle's dependencies {}blok:

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
    compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"

    testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}

Namun tidak bekerja untuk pengujian unit
Malachiasz

Saya telah memodifikasi jawaban Anda untuk bekerja dengan Tes unit juga.
Malachiasz

4

Saya juga ragu-ragu melintasi ClassNotFoundException: javax.xml.bind.DatatypeConverter menggunakan Java 11 dan

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

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

Java11 dan jjwt 0.9.x dan Anda menghadapi ClassNotFoundException: javax.xml.bind.DatatypeConverter,

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.


3

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:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more

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 ...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg

Dan itu berhasil!


1
Saya tidak mengerti downvote. Rupanya orang ingin bermain-main dengan opsi baris perintah daripada benar-benar mendapatkan botol? Sesuaikan diri Anda.
David Tonhofer

7
Pengembang Java biasanya menggunakan alat bangun seperti Gradle atau Maven untuk mengelola dependensi daripada mengunduh guci secara manual. Mungkin itulah alasan suara turun.
Joshua Davis

3

Anda hanya perlu 1 ketergantungan:

dependencies {
    implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")

2

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


2

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


2
Distribusi Amazon Corretto untuk JDK 11 tidak menyediakan kelas javax.xml.bind. Jika masalah teratasi setelah beralih ke Correto, itu karena Anda diturunkan ke JDK 8.
Andy Guibert

aneh, saya akan periksa, di buruh pelabuhan saya menggunakan correto terbaru
Armen Arzumanyan

Ya, amazoncorretto:latestsaat 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 -> 11
Andy Guibert

2

Versi ketergantungan yang perlu saya gunakan saat mengkompilasi target Java 8. Aplikasi yang diuji di Java 8, 11, dan 12 JRE.

        <!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->

2

Bagi saya di Java 11 dan gradle inilah yang berhasil:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}

di mana tepatnya kita meletakkannya?
nyxee

Di file build.gradle Anda jika Anda menggunakan gradle.
silver_mx

1

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.

<!-- API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

1

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


harap pertimbangkan untuk menambahkan setidaknya bagian dari solusi dalam jawaban Anda karena jawaban hanya tautan akan menjadi tidak valid jika url berubah di masa mendatang.
yukashima huksay

0

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!


2
Meskipun ini dapat membantu OP, lebih baik menambahkan lebih banyak detail, contoh, dll.
Tiw

0

Jika Anda memanggil layanan web SOAP (misalnya, menggunakan jaxws-maven-plugin) hanya dengan menambahkan dependensi ini semua kesalahan JAXB hilang:

<dependency>
            <groupId>org.glassfish.metro</groupId>
            <artifactId>webservices-rt</artifactId>
            <version>2.4.3</version>
</dependency>

Diuji dengan Java 13

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.