Native Library xxx.so already loaded in another classloader 的解決方法

1、症狀

如果JBoss上的兩個web應用需要使用相同的JNI本地庫,當第二個web應用加載JNI本地庫時,就會出現Native Library xxx.so already loaded in another classloader錯誤

2、原因

 Java虛擬機爲了在JNI本地庫中確保基於classloader的命名空間隔離,因而不允許一個JNI本地庫被兩個不同的classloader加載。而JBoss中web應用的classloader是獨立的,也就是說每個web應用都有一個專屬的classloader,這樣就出現兩個classloader加載同一JNI本地庫的情況

3、解決方法

在JBoss AS中,雖然不同的web應用使用不同的classloader,但是web應用classloader的父classloader是相同的,這樣根據雙親委託模型只要讓父classloader加載JNI本地庫就可以避免被多個classloader加載。父classloader的classpath爲JBoss AS配置(default、all或minimal)的lib目錄,因而只要將JNI class單獨發佈成jar包,並放在配置(default、all或minimal)的lib目錄中,問題就可以解決

發佈了47 篇原創文章 · 獲贊 0 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章