2013-03-26 38 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

相关问题