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