7

技术摘要:我正在开发一个部署在 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 应用程序中的代码无法访问启动时加载的库。

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

提前致谢。

4

2 回答 2

4

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

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

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

于 2010-02-23T15:12:34.467 回答
2

解决了!

最后,我把碎片放在一起。

缺失的部分将 JNI 库(例如jni_wrapper_for_libabc.jar)添加到 GF 共享文件夹domains/domain1/lib并且它工作。本机库由生命周期模块中的单例类加载,该模块在 GF 启动时被调用。

非常感谢帕斯卡,伟大的帮助伙伴!

干杯

于 2010-02-27T14:30:06.330 回答