jna Native.LoadLibrary 无法在服务器上加载库(在本地工作)

jna Native.LoadLibrary does not manage to load library on server (working in local)

我使用 JNA 在 java 项目中加载 C++ 库 (.so)。我将我的库打包在 jar 中,并在实例化使用它的 java class 时从 jar 加载它。我是这样做的:

其中 temp 是包含在 jar 中找到的库的临时文件。此代码基于此处找到的工作 adamheinrich - 我调用 Native.loadLibrary(LIBRARYPATH) 将库包装成 java class.

    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.classForName(MetadataBuilderImpl.java:758)
    at org.hibernate.annotations.common.reflection.java.JavaReflectionManager.classForName(JavaReflectionManager.java:144)
    at... 

这个错误似乎是找到了库,因为没有抛出 UnsatisfiedLinkError 异常。但是其他事情失败了。有人知道会发生什么吗?我该如何调试?

我记得在本地一切正常。

How could I debug?

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 摘要选项卡,然后 check/compare 非常小心 VM arguments/classpath/library path/boot class 路径

3。使用 ldd

的依赖列表

如果可能是依赖项问题,ldd sharedLibraryFile.so 命令会列出所有依赖项并允许跟踪可能缺少的依赖项。