Mengendalikan NoClassDefFoundError untuk JAXBException di Java 9

1. Pengenalan

Bagi sesiapa yang telah mencuba peningkatan ke Java 9, mereka mungkin mengalami semacam NoClassDefFoundError ketika menyusun kod yang sebelumnya berfungsi di versi Java sebelumnya.

Dalam artikel ini, kita akan melihat kelas umum yang hilang, JAXBException , dan pelbagai cara untuk menyelesaikannya. Penyelesaian yang disediakan di sini biasanya berlaku untuk kelas yang mungkin hilang semasa menaik taraf ke Java 9.

2. Mengapa Java 9 Tidak Dapat Mencari Pengecualian JAXB ?

Salah satu ciri Java 9 yang paling dibincangkan adalah sistem modul. Matlamat sistem modul Java 9 adalah untuk memisahkan kelas JVM teras dan projek yang berkaitan menjadi modul yang berdiri sendiri . Ini membantu kami membuat aplikasi dengan jejak kaki yang lebih kecil dengan hanya memasukkan kelas minimum yang diperlukan untuk dijalankan.

Kelemahannya ialah banyak kelas tidak lagi tersedia di classpath secara lalai. Dalam kes ini, kelas JAXBException boleh didapati di salah satu modul EE Jakarta baru bernama java.xml.bind . Oleh kerana modul ini tidak diperlukan oleh Java runtime teras, ia tidak tersedia di classpath secara lalai.

Mencuba menjalankan aplikasi yang menggunakan JAXBException akan menghasilkan:

NoClassDefFoundError: javax/xml/bind/JAXBException

Untuk menyelesaikannya, kita mesti memasukkan modul java.xml.bind . Seperti yang akan kita lihat di bawah, terdapat pelbagai cara untuk mencapai ini.

3. Penyelesaian Jangka Pendek

Cara yang paling cepat untuk memastikan kelas JAXB API disediakan untuk permohonan adalah untuk menambah penggunaan -Tambah-modul perintah garis hujah :

--add-modules java.xml.bind

Walau bagaimanapun, ini mungkin bukan penyelesaian yang baik untuk beberapa sebab.

Pertama, argumen –add-modules juga baru di Java 9. Untuk aplikasi yang perlu dijalankan pada beberapa versi Java, ini menghadirkan beberapa cabaran. Kita harus mengekalkan beberapa set file build, satu untuk setiap versi Java yang dijalankan aplikasi.

Untuk menyelesaikannya, kita juga boleh menggunakan argumen baris perintah -XX: + IgnoreUnrecognizedVMOptions untuk penyusun Java yang lebih lama.

Namun, ini bermaksud sebarang kesalahan ketik atau kesalahan ejaan tidak akan diketahui oleh kami. Sebagai contoh, jika kita berusaha menetapkan ukuran timbunan minimum atau maksimum dan salah menaip nama argumen, kita tidak akan mendapat amaran. Aplikasi kami masih akan dimulakan, tetapi akan berjalan dengan konfigurasi yang berbeza daripada yang kami jangkakan.

Kedua, pilihan –add-modul akan ditamatkan dalam rilis Java yang akan datang. Ini bermaksud pada suatu ketika setelah kita meng-upgrade ke Java versi baru, kita akan menghadapi masalah yang sama dengan menggunakan argumen baris perintah yang tidak diketahui dan harus mengatasi masalah itu lagi.

4. Penyelesaian Jangka Panjang

Terdapat pendekatan yang lebih baik yang akan berfungsi di pelbagai versi Java dan tidak akan putus dengan rilis yang akan datang.

Penyelesaiannya adalah dengan menggunakan alat pengurusan ketergantungan seperti Maven . Dengan pendekatan ini kita akan menambahkan perpustakaan API JAXB sebagai pergantungan seperti perpustakaan lain:

 javax.xml.bind jaxb-api 2.3.0 

Perpustakaan di atas hanya mengandungi kelas API JAXB, yang merangkumi JAXBException . Bergantung pada aplikasi, kita mungkin perlu memasukkan modul lain.

Perlu diingat juga bahawa nama artefak Maven mungkin berbeza daripada nama modul Java 9 , seperti halnya API JAXB. Ia boleh didapati di Maven Central.

5. Kesimpulan

Sistem modul Java 9 memberikan sejumlah kelebihan seperti penurunan ukuran aplikasi dan prestasi yang lebih baik.

Namun, ia juga memperkenalkan beberapa akibat yang tidak diingini. Semasa menaik taraf ke Java 9, penting untuk memahami modul mana yang benar-benar diperlukan aplikasi dan mengambil langkah-langkah untuk memastikannya tersedia di classpath.