glassfish - Java Web 应用程序不能使用 native 库 (.so)

标签 glassfish java-native-interface loadlibrary

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

我的 Web 服务使用本地库 (.so) 提供的功能。 native 库工作正常,但是我在正确配置环境以加载 native 库方面运气不佳,但不受 Web 应用程序重新部署的影响,无需重新启动应用程序服务器。

到目前为止我所做的是:

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

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

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

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

提前致谢。

最佳答案

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

我确实会放置 JNI 库和调用 System.loadLibrary(String) 的类,例如一个单例,在 webapp 之外并在 domain/lib 中部署此代码或 domain/lib/applibs (参见 File Layout in V3this thread 了解更多背景信息)。

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

关于glassfish - Java Web 应用程序不能使用 native 库 (.so),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319030/

相关文章:

java - 是否可以覆盖 glassfish\modules\webservices-osgi.jar 中的类?

eclipse - JNI : No rule to make target issue

c++ - 如何跨多个线程在 COM 中使用 LoadLibrary?

java - glassfi下如何使用hornetq和struts2

java - 我应该在哪里放置 XHTML 文件才能使其在 GlassFish Web 容器中可见?

javax.security.auth.login.LoginException : Security Exception

java - 运行 Hadoop 作业时出现类加载问题

JavaCpp:如何指定 native 库?

winapi - LoadLibrary 失败并且依赖遍历器没有帮助

windows - 是否可以将 DLL 加载到地址空间而不是从文件系统文件加载?