如何在Tomcat上处理多个Web应用程序共享本机库

3
有两个基于Tomcat 6.0.35的Web应用程序需要一个库(jar文件)。并且其中一个类在运行时需要本地库。
如果同时部署了两个应用程序,则会出现异常:
java.lang.UnsatisfiedLinkError: Native Library my-native-library.so already loaded in another classloader 在jar文件中,本地库是使用静态块加载的,并且使用xml配置了使用本地库的类。
这个库是我们构建的搜索引擎,因此我们可以重新构建它。我的问题是如何告诉Tomcat另一个Web应用程序已经加载了my-native-library.so,以便该应用程序可以忽略静态块。
根据我的理解:
搜索引擎库需要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)。

这个问题有几个重复的提问,其中包含了很好的信息但没有被采纳的答案。我建议从这里开始。 - Perception
1个回答

1

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)在eclipse中添加-Djava.library.path="/home/me/apache-tomcat-6.0.35/shared/lib"参数。然而,我仍然遇到相同的异常。我有什么遗漏吗? - user200340
你发布的步骤似乎是正确的。然而,你得到“库在另一个类加载器中已经被加载”的事实证明它被加载了不止一次。请检查库是否不在WEB-INF/lib或WEB-INF/classes目录下,并且Web应用程序没有使用自定义类加载器来加载该库。类加载器问题可能会变得非常复杂和难以排除。 - Kurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接