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目錄中,問題就可以解決