关于Java:如何在Tomcat上的多个Web应用程序中处理共享本机库

 2020-11-22 

How to handle shared native library in multiple web applications on Tomcat

在Tomcat 6.0.35上,我们的两个Web应用程序都需要一个库(jar文件)。 jar文件中的类之一需要运行本机库。

不出所料,我正在例外

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

如果同时播放两个应用程序。

在jar文件中,使用静态块加载本机库

1
2
3
4
5
6
7
8
9
10
11
static
{
    try
    {          
        System.loadLibrary("my-native-library.so");

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

并且使用xml可以配置使用本机库的类。

jar库是我们构建的搜索引擎,因此如有必要,我们可以对其进行重建。

所以我的问题是我们如何告诉Tomcat my-native-library.so已被另一个Web应用程序加载,并且
此应用程序可以忽略静态块。

编辑:
jar库和Web应用程序都在使用maven。

谢谢。

编辑:
据我了解:

搜索引擎库需要my-native-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)。


在那种情况下,我会将库加载到Tomcat的共享类加载器中,这样它在系统中仅加载一次。 查看Tomcat类加载器文档以获取更多详细信息:

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