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