技术摘要:我正在开发部署在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应用程序中的代码无法访问启动时加载的库.
谁能告诉我我做错了什么?
提前致谢.