Java Web应用程序无法使用本机库(.so)

wat*_*rks 7 java-native-interface glassfish loadlibrary

技术摘要:我正在开发部署在GlassFish v3上的Java Web服务,在CentOS 5上运行.

我的Web服务使用本机库(.so)提供的功能.本机库工作正常,但我没有太多运气正确配置环境以加载本机库但不受Web应用程序重新部署的影响,而无需重新启动应用程序服务器.

到目前为止我所做的是:

最初我在Web服务代码中加载了库(静态{System.load(path/to/libabc.so)};),所有路径设置正确,并且工作正常,直到我重新部署应用程序并且它抱怨该库由另一个ClassLoader加载.我发现本机库只加载一次.

为了尝试解决这个问题,我从Web应用程序中删除了库加载代码,创建了一个Singleton类,将其包装到Lifecyle模块中,将其部署到GlassFish共享库文件夹,然后配置GlassFish以在启动时运行包装器.我们的想法是,现在所有的Web应用程序都能够引用它,因为它不依赖于某个特定的Web应用程序,而是由层次结构中较高的ClassLoader加载.

当GlassFish启动时,本机库成功加载(linux> lsof | grep libabc.so).但是,在我的Web服务Java代码中执行本机方法时,Web服务代码失败并出现UnsatisfiedLinkError.在我看来,Web应用程序中的代码无法访问启动时加载的库.

谁能告诉我我做错了什么?

提前致谢.

Pas*_*ent 4

关于“生命周期模块”我不能说太多(我不知道它们是否应该对部署到 GlassFish 的应用程序“可见”)但是......

我确实会将 JNI 库和调用的类System.loadLibrary(String)(例如单例)放在 web 应用程序之外,并将此代码部署在domain/lib或中domain/lib/applibs( 有关它们的更多背景信息,请参阅V3 中的文件布局此线程)。

这应该使代码对您的应用程序可见,并且您的应用程序可以抵抗重新部署。