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

Glassfish Java web应用程序无法使用本机库(.so),glassfish,java-native-interface,loadlibrary,Glassfish,Java Native Interface,Loadlibrary,技术总结:我正在开发一个部署在GlassFish v3上的Java web服务,运行在CentOS 5上 我的web服务使用本机库(.so)提供的功能。本机库工作正常,但是我没有太多的运气正确配置环境以加载本机库,而不受web应用程序重新部署的影响,无需重新启动应用程序服务器 到目前为止,我所做的是: 最初,我在web服务代码中加载了库(static{System.load(path/to/libabc.so)};),所有路径都设置正确,工作正常,直到我重新部署应用程序,它抱怨库被另一个类加载器

技术总结:我正在开发一个部署在GlassFish v3上的Java web服务,运行在CentOS 5上

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

到目前为止,我所做的是:

最初,我在web服务代码中加载了库(static{System.load(path/to/libabc.so)};),所有路径都设置正确,工作正常,直到我重新部署应用程序,它抱怨库被另一个类加载器加载。我发现本机lib只加载一次

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

GlassFish启动后,本机库将成功加载(linux>lsof | grep libabc.so)。但是,当在我的web服务Java代码中执行本机方法时,web服务代码失败,并出现一个不满意的链接错误。在我看来,web应用程序中的代码似乎无法访问启动时加载的库

谁能告诉我我做错了什么

提前感谢。

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

我确实会将JNI库和调用
System.loadLibrary(String)
的类(例如singleton)放在webapp之外,并将此代码部署在
domain/lib
domain/lib/applibs
(有关它们的更多背景信息,请参阅和)

这将使代码对您的应用程序可见,并且您的应用程序不会重新部署。

! 最后,我把这些碎片拼在一起

缺失部分将JNI库(例如,
JNI\u wrapper\u for_libabc.jar
)添加到GF共享文件夹
domains/domain1/lib
)中,效果良好。本机库由生命周期模块中的单例类加载,该模块在GF启动时调用

非常感谢帕斯卡,帮了大忙,伙计


干杯

Pascal,谢谢您的回复。我没有使用Lifecyle模块,而是将Singleton类放在/domain/lib中的jar中。在webapp中,我动态加载类,如下所示:class c=class.forName(“com.name.utils.SingletonClass”,true,this.getClass().getClassLoader())。。然后我部署:asadmin deploy–libraries MyLib.jar/path/to/web_app.war。当我运行web应用程序时,本机库成功加载,但我仍然收到未满足的链接错误。这看起来像是类加载器问题吗?@water sparks问题在哪里。那么?在单身汉旁边的罐子里?作为补充说明,您不需要动态加载该类(但这不是根本原因,
unsatifiedlinkerror
表示找不到本机库)。不,.so位于/usr/local/lib中。顺便说一句,如果我不动态加载类,.so如何加载?@water sparks噢,我没有注意到您使用的是
System.load
,它确实以完整路径作为参数,我以为您使用的是
System.loadLibrary
,它更便于移植,但要求本机库位于库路径上(在GlassFish控制台的LD_LIBRARY_PATH或
-Djava.LIBRARY.PATH
或configuration>JVM设置>路径设置>本机库路径后缀中).关于第二部分,.so的加载是在静态块中完成的,因此实例化类一次就足够了。我确实使用了
System.load
,很抱歉格式化。最初不知道本机库后缀,后来添加了它。此时我实例化了单例(loading.so)动态地从同样使用本机方法的webapp开始。假定库加载类位于
/domain/lib
中,我应该从何处实例化它,以便webapp可以使用本机库?谢谢