Sunday, October 16, 2011

Troubleshooting : java.lang.LinkageError: loader constraint violation

Environment: NetBeans IDE 7.0.1
Trigger : Menjalankan Program Setelah Mengimport sebuah library bernama org.openide.nodes

Beberapa waktu yang lalu saya sempat mencoba mengikuti tutorial tentang membuat aplikasi CRUD (Create, Read, Update, and Delete) dengan menggunakan Netbeans Platform. Salah satu fiturnya adalah menampilkan daftar nama "Customer" dalam bentuk TreeView (sebuah list dengan hirarki). Nah, untuk bisa merealisasikan fitur tersebut kita perlu mengimplementasikan sebuah library yang bernama org.openide.nodes. akhirnya saya melakukan import library secara manual dengan cara "klik kanan pada (projectku->modules) dan memilih menu add library". setelah saya melakukan import library kemudian saya meng-compile source code yang sudah saya buat. Proses kompilasi pun berhasil namun ternyata ketika saya mengklik "run" pada netbeans untuk menjalankan aplikasi tersebut, muncul sebuah error pada saat Runtime isi stackTrace-nya seperti ini:

java.lang.LinkageError: loader constraint violation: when resolving method "org.openide.explorer.ExplorerManager.setRootContext(Lorg \ openide\ nodes \ Node )V" the class loader (instance of org/netbeans/StandardModule$OneModuleClassLoader) of the current class, org/gaza/viewer/AdkViewerTopComponent, and the class loader (instance of org/netbeans/StandardModule$OneModuleClassLoader) for resolved class, org/openide/explorer/ExplorerManager, have different Class objects for the type orer.ExplorerManager.setRootContext(Lorg \ openide \ nodes \ Node)V used in the signature

Nah, disitu terlihat bahwa error-nya terjadi ketika saya memanggil sebuah method yang bernama setRootContext yang memiliki parameter bertipe Nodes dari org.openide.nodes.Node. Mengapa hal ini bisa terjadi? setelah saya cari-cari di google, penyebab dari error ini adalah karena saya memanggil library yang sama secara bersamaan pada modul yang berbeda.

Gambar 1: Penyebab Linkage Error
Jika kawan-kawan melihat Gambar 1 di atas, terlihat bahwa saya memasukan modul bernama OpenideNodesAPI di 2 tempat yaitu: DBManager dan AdkViewer. Hal ini terjadi karena saya memasukkan library secara manual pada modul AdkViewer dan dikarenakan AdkViewer merupakan modul dari DBManager, maka secara otomatis DBManager juga mengikutkan OpenideNodesAPI sebagai modul (nama ini saya buat sendiri ketika memasukkan library secara manual) sebagai modul tersendiri. Jadi, untuk bisa menyelesaikannya kita perlu menghilangkan modul OpenideNodesAPI di salah satu modul yang kita buat.

Solusi:
Inilah cara yang saya lakukan untuk menyelesaikan masalah linkageError ini:

  1. Hapus semua modul yang konflik (dalam hal ini OpenideNodesAPI) di semua modul (AdkViewer dan DBManager). dengan cara ini kita memastika tidak ada modul yang memanggil library tersebut.
  2. Import library hanya pada modul yang membutuhkan (dalam hal ini adalah AdkViewer) namun tidak dengan cara manual, melainkan dengan menggunakan "Add Module Dependency". caranya adalah dengan melakukan klik-kanan pada AdkViewer->library. nanti akan keluar pilihan "Add Module Dependency".
  3. Ketik nama dependency yang akan dimasukkan seperti misalnya: "Nodes API" (haha ternyata sudah tersedia modul dependency-nya... knapa saya import manual ya? :D) kemudian pilih Ok
  4. Check pada bagian AdkViewer->library apakah sudah terinclude dependency yang kita butuhkan? jika sudah maka prosesnya telah selesai. Jika belum berari ada masalah lagi XD
Gambar 2: Add Module Dependency

Gambar 3: Nodes API berhasi diimport tanpa duplikasi
Dengan begini masalah java.lang.LinkageError: loader constraint violation telah berhasil kita selesaikan hehehe.. semoga informasi ini bermanfaat :)

No comments:

Post a Comment