3

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

正如预期的那样,我遇到了异常

java.lang.UnsatisfiedLinkError:本机库 my-native-library.so
已经在另一个类加载器中加载

如果两个应用程序同时被延迟。

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

静止的
{
    尝试
    {           
        System.loadLibrary("my-native-library.so");

    } 捕捉(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)。

4

1 回答 1

1

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

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

于 2013-03-26T10:57:52.877 回答