【问题标题】:How to handle shared native library in multiple web applications on Tomcat如何在 Tomcat 上处理多个 Web 应用程序中的共享本机库
【发布时间】:2013-03-26 10:43:26
【问题描述】:

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)。

【问题讨论】:

  • 这个问题有几个重复,有很好的信息,但没有接受的答案。我建议从here开始。

标签: java jakarta-ee tomcat


【解决方案1】:

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

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

【讨论】:

  • 感谢库尔特,我尝试了以下方法 (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)添加-Djava.library.path="/home/me/apache -tomcat-6.0.35/shared/lib” eclipse 的参数。但是,我仍然遇到同样的异常。我错过了什么吗?
  • 您发布的步骤似乎正确。但是,您将“库加载到另一个类加载器”这一事实证明它被加载了不止一次。检查 libray 不在 WEB-INF/lib o WEB-INF/classes 目录下,并且 Web 应用程序没有使用正在加载库的自定义类加载器。类加载器问题可能会变得非常复杂且难以排除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2011-06-24
  • 2012-08-13
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多