2013-03-26 37 views
3

Tomcat 6.0.35上有兩個Web應用程序需要庫(jar文件)。而且jar文件中的一個類需要運行一個本地庫。如何處理Tomcat上多個Web應用程序中的共享本地庫

正如預期的那樣,我如果兩個應用程序在同一時間deplayed我得到異常

 
java.lang.UnsatisfiedLinkError: Native Library my-native-library.so 
already loaded in another classloader 

在jar文件,本機庫使用靜態塊

 
static 
{ 
    try 
    {   
     System.loadLibrary("my-native-library.so"); 

    } catch (UnsatisfiedLinkError e) 
    { 
     e.printStackTrace(); 
    } 
} 

和類,使用本機庫可配置使用XML加載。

jar庫是由我們構建的搜索引擎,所以我們可以在必要時重建它。

所以我的問題是我們如何告訴Tomcat my-native-library.so已被另一個web應用程序加載,並且該應用程序的靜態塊可以被忽略。

編輯: jar庫和web應用程序都使用maven。

謝謝。

編輯: 按照我的理解:

的搜索引擎庫需要我的母語,library.jar文件構建成一個JAR庫。然後,搜索引擎jar庫託管在我們的資源庫中,並使用maven構建到我們的Web應用程序中。當服務器啓動時,具有共享庫路徑的LD_LIBRARY_PATH和JAVA_OPTS被公開,服務器能夠加載my-native-library.so一次。但是,這兩個Web應用程序都包含搜索引擎jar,而my-native-library.jar將包含在WEB_INF/lib中,幷包含異常。

要從WEB_INF/lib中刪除my-native-library.jar,搜索引擎庫需要重建而沒有必要的依賴關係(my-native-library.jar)。

+0

有此問題的幾個DUP的,具有良好的信息,但沒有公認的答案。我會建議開始[這裏](http://stackoverflow.com/questions/3724421/native-library-already-loaded-in-another-classloader)。 – Perception 2013-03-26 10:54:12

回答

1

在這種情況下,我會將庫加載到Tomcat中的共享類加載器中,以便它只在系統中加載一次。看看Tomcat的類加載器的文檔瞭解更多信息:

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

+1

感謝Kurt,我嘗試了以下方法(1)將my-native-library.so複製到$ {catalina.base}/shared/lib(2)將my-native-library.jar複製到$ {catalina.base}/lib(3)將catalina.properties共享類加載器修改爲shared.loader = $ {catalina.base}/shared/lib(4)add -Djava.library.path =「/ home/me/apache-tomcat-6.0.35 /共享/ lib「參數到日食。但是,我仍然得到同樣的例外。我錯過了什麼嗎? – user200340 2013-03-26 11:57:04

+0

您發佈的步驟似乎正確。但是,您獲得「在另一個類加載器中加載的庫」的事實證明,它正在被加載多次。檢查libray不在WEB-INF/lib或WEB-INF/classes目錄下,並且Web應用程序不使用加載庫的自定義類加載器。 類加載器問題會變得非常複雜,難以排除故障。 – Kurt 2013-03-26 13:38:09

相關問題