Saya memiliki proyek Java di Eclipse yang menggunakan kelas javax.xml.bind.JAXB. Memulai aplikasi dari dalam Eclipse berfungsi dengan baik. Namun, ketika saya mengekspor proyek sebagai file jar (yang dapat dijalankan) dan menjalankannya menggunakan java -jar myfile.jar itu berakhir dengan java.lang.NoClassDefFoundError: javax/xml/bin/JAXBException.

Juga bermain-main dengan tiga opsi untuk penanganan Perpustakaan di Spesifikasi File JAR Eclipse Runnable (ekstrak, paket, sub-folder) tidak menyelesaikan masalah - pada kenyataannya, tidak ada perpustakaan yang diekspor dalam hal apa pun.

Tampaknya perpustakaan untuk JAXB (tampaknya rt.jar) tidak dianggap sebagai perpustakaan yang diperlukan untuk dimasukkan ke dalam file jar. Namun, ketika menjalankan file jar, itu tidak ditemukan. Saya telah membaca bahwa perpustakaan harus ditambahkan ke classpath tetapi ini tampak aneh bagi saya karena rt.jar adalah bagian dari perpustakaan standar. Apakah ada yang spesial dari perpustakaan ini?

Saat ini, saya tidak menggunakan Maven atau yang serupa untuk ketergantungan dan manajemen pembangunan dan jika mungkin saya ingin menghindarinya untuk masa depan. Saya pikir, pasti juga ada jalan tanpa Maven.

Saya menemukan beberapa posting di sini di SO dan di Google tetapi tidak dapat menemukan solusi untuk saya.

Terima kasih banyak!

0
Matthias Heinlein 8 Januari 2021, 19:42

2 jawaban

Saya sendiri juga memikirkan hal ini, karena saya baru mengenal Java.

Ada deskripsi Mekanisme Ekstensi di tutorial java (SE), tetapi tidak lagi digunakan sejak ditinggalkan oleh Oracle. Lihat, hanya untuk mengetahui apa yang saya bicarakan: https://docs. oracle.com/javase/tutorial/ext/index.html

Singkatnya apa Ekstensi ini: cukup letakkan file jar Anda di dalam jdk lib dan Anda bisa menggunakan kata kunci import di semua kelas Anda untuk menggunakan file jar baru.

Namun, yang lain harus melakukan hal yang sama di komputer mereka untuk menjalankan kelas yang mengimpor pembaruan Anda sendiri ke jdk.

Maven melakukan sesuatu seperti di atas. Ini mencari di file pom file jar lain yang harus disertakan dalam jar Anda saat Anda membangun aplikasi. Oleh karena itu, dapat berjalan di mana saja.

Cara lain untuk melihat ini adalah jawaban yang harus Anda coba lakukan. Cara yang lebih sulit untuk melakukan apa yang dilakukan Maven tanpa struktur pomnya adalah dengan membuat folder baru di dalam folder src Anda dan menyalin file jakarta.xml.bind-api.jar. Sama seperti saat Anda membuat objek (aJavaBean) dan perlu menggunakannya di kelas lain.

File yang perlu Anda sertakan di perpustakaan Anda tersedia di: https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/3.0.0/jaxb-ri-3.0.0.zip

Terakhir, ekstrak kelas di dalam folder yang baru dibuat ini dan gunakan kata kunci import di kelas yang bergantung padanya seperti saat Anda membuat kelas sendiri.


Hal lain yang harus Anda coba adalah menggunakan file manifes saat membuat jar. https://docs.Oracle.com/javase/tutorial/deployment/ jar/manifestindex.html

Tutorial ini menunjukkan cara memasukkan classpath ke file yang perlu Anda jalankan sebagai dependensi. Pastikan semua yang Anda butuhkan ada di dalam file jar yang baru dibuat. Juga, atur titik masuk dalam manifes, sehingga aplikasi Anda dapat berjalan hanya menggunakan

    java -jar MyJar.jar

Di baris perintah.

1
Juliano Suman Curti 8 Januari 2021, 18:11

Cara termudah adalah dengan menggunakan JDK 8 (atau JDK yang lebih lama) yang telah menyematkan pustaka jaxb yang diperlukan. Cara yang sulit mengharuskan Anda mengatur variabel CLASSPATH Anda yang menunjuk ke setiap file jar jaxb yang diperlukan.

Dari spesifikasi di https ://javaee.github.io/jaxb-v2/doc/user-guide/release-documentation.html#a-2-3-0, toples berikut diperlukan menggunakan Java versi 11 atau lebih tinggi.

  • jaxb-api.jar
  • jaxb-core.jar
  • jaxb-impl.jar

Artikel bagus tentang pertanyaan ini adalah https://www.jesperdj.com/2018/09/30/jaxb-on-java-9-10-11-and-beyond/

1
user2862981 8 Januari 2021, 18:30