Menangani NoClassDefFoundError untuk JAXBException di Java 9

1. Perkenalan

Bagi siapa pun yang mencoba meningkatkan ke Java 9, mereka mungkin pernah mengalami semacam NoClassDefFoundError saat mengompilasi kode yang sebelumnya berfungsi di versi Java sebelumnya.

Pada artikel ini, kita akan melihat kelas umum yang hilang, JAXBException , dan cara berbeda untuk menyelesaikannya. Solusi yang disediakan di sini umumnya berlaku untuk semua kelas yang mungkin hilang saat meningkatkan ke Java 9.

2. Mengapa Java 9 Tidak Dapat Menemukan JAXBException ?

Salah satu fitur yang paling banyak dibahas dari Java 9 adalah sistem modul. Tujuan dari sistem modul Java 9 adalah untuk memecah kelas inti JVM dan proyek terkait menjadi modul yang berdiri sendiri . Ini membantu kami membuat aplikasi dengan footprint yang lebih kecil dengan hanya menyertakan kelas minimum yang diperlukan untuk dijalankan.

Kekurangannya adalah banyak kelas tidak lagi tersedia di classpath secara default. Dalam hal ini, kelas JAXBException dapat ditemukan di salah satu modul EE Jakarta baru bernama java.xml.bind . Karena modul ini tidak diperlukan oleh runtime Java inti, modul ini tidak tersedia di classpath secara default.

Mencoba menjalankan aplikasi yang menggunakan JAXBException akan menghasilkan:

NoClassDefFoundError: javax/xml/bind/JAXBException

Untuk menyiasatinya kita harus menyertakan modul java.xml.bind . Seperti yang akan kita lihat di bawah, ada beberapa cara untuk melakukannya.

3. Solusi Jangka Pendek

Cara tercepat untuk memastikan kelas JAXB API yang tersedia untuk aplikasi adalah dengan menambahkan penggunaan -Tambahkan-modul perintah argumen baris :

--add-modules java.xml.bind

Namun, ini mungkin bukan solusi yang baik karena beberapa alasan.

Pertama, argumen –add-modules juga baru di Java 9. Untuk aplikasi yang perlu dijalankan pada beberapa versi Java, ini menghadirkan beberapa tantangan. Kami harus mempertahankan beberapa set file build, satu untuk setiap versi Java tempat aplikasi berjalan.

Untuk mengatasi ini, kita juga bisa menggunakan argumen baris perintah -XX: + IgnoreUnrecognizedVMOptions untuk kompiler Java yang lebih lama.

Namun, ini berarti argumen salah ketik atau salah eja tidak akan menjadi perhatian kami. Misalnya, jika kami mencoba menyetel ukuran heap minimum atau maksimum dan salah mengetik nama argumen, kami tidak akan mendapatkan peringatan. Aplikasi kami akan tetap berjalan, tetapi akan berjalan dengan konfigurasi yang berbeda dari yang kami harapkan.

Kedua, opsi –add-modules tidak akan digunakan lagi pada rilis Java mendatang. Ini berarti di beberapa titik setelah kita meningkatkan ke versi baru Java, kita akan menghadapi masalah yang sama dalam menggunakan argumen baris perintah yang tidak dikenal dan harus mengatasi masalah itu lagi.

4. Solusi Jangka Panjang

Ada pendekatan yang lebih baik yang akan bekerja di berbagai versi Java dan tidak akan rusak dengan rilis mendatang.

Solusinya adalah dengan memanfaatkan alat manajemen ketergantungan seperti Maven . Dengan pendekatan ini kita akan menambahkan pustaka JAXB API sebagai dependensi seperti pustaka lainnya:

 javax.xml.bind jaxb-api 2.3.0 

Pustaka di atas hanya berisi kelas JAXB API, yang mencakup JAXBException . Tergantung pada aplikasinya, kami mungkin perlu memasukkan modul lain.

Juga perlu diingat bahwa nama artefak Maven mungkin berbeda dari nama modul Java 9 , seperti halnya JAXB API. Itu dapat ditemukan di Maven Central.

5. Kesimpulan

Sistem modul Java 9 memberikan sejumlah keuntungan seperti mengurangi ukuran aplikasi dan kinerja yang lebih baik.

Namun, ini juga menimbulkan beberapa konsekuensi yang tidak diinginkan. Saat meningkatkan ke Java 9, penting untuk memahami modul mana yang benar-benar dibutuhkan aplikasi dan mengambil langkah-langkah untuk memastikan modul tersebut tersedia di classpath.