[英]jna Native.LoadLibrary does not manage to load library on server (working in local)
我使用JNA在Java项目中加载c ++库(.so)。 我将我的库打包到jar中,并在实例化使用它的java类时从jar中加载它。 我这样做是这样的:
我在实例化LibraryWrapperClass时在静态上下文中调用以下内容
System.load( temp.getAbsolutePath() );
其中temp
是一个临时文件,其中包含在jar中找到的库。 这段代码基于在adamheinrich中找到的工作-我调用Native.loadLibrary(LIBRARYPATH)
将库包装为Java类。
private interface Wrapper extends Library {
Wrapper INSTANCE = Native.loadLibrary( C_LIBRARY_PATH, Wrapper.class );
Pointer Constructor();
...
}
我的问题是,当我在服务器上部署时,LibraryWrapperClass无法实例化。 服务器上的错误是:
java.lang.NoClassDefFoundError: Could not initialize class pacakgeName.LibraryWrapperClass
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at org.hibernate.annotations.common.util.StandardClassLoaderDelegateImpl.classForName(StandardClassLoaderDelegateImpl.java:57)
at org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl$4.classForName(MetadataBuilderImpl.java:758)
at org.hibernate.annotations.common.reflection.java.JavaReflectionManager.classForName(JavaReflectionManager.java:144)
at...
似乎没有找到此错误,因为没有引发UnsatisfiedLinkError
异常。 但是还有其他的失败。 有人知道会发生什么吗? 我该如何调试?
我记得在本地一切都很好。
我该如何调试?
1.与strace
strace将为您提供Tomcat试图打开的文件: strace -f -e trace=file -o log.txt bin/startup.sh
之后,在log.txt中查找packageName,或者在以下文件中找不到其他文件:
egrep ' open.*No such file' log.txt
2.使用JConsole
启用JMX,启动JConsole,转到VM摘要选项卡,并非常仔细地检查/比较VM参数/类路径/库路径/引导类路径
3.带有ldd的依赖项列表
如果可能是依赖关系问题,那么ldd sharedLibraryFile.so
命令将列出所有依赖关系,并允许跟踪可能缺少的依赖关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.