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

标签 java tomcat noclassdeffounderror jna

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

  • mvn install 编译c++代码并将生成的动态库打包到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();
        ...
    }
  • 我运行测试并验证该库已找到并启动并运行。
  • 我使用依赖于此项目的 Java Web 项目。它使用 tomcat 并在本地运行良好。

我的问题是,当我在服务器上部署时,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 异常。但是其他事情失败了。有人知道会发生什么吗?我该如何调试?

我记得一切都在本地完美运行。

最佳答案

How could I debug?

<强>1。带跟踪

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 命令会列出所有依赖项并允许跟踪可能缺少的依赖项。

关于java - jna Native.LoadLibrary 无法在服务器上加载库(在本地工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359639/

相关文章:

java - 带-Xms8g的Wildfly 11仅运行400m

java - arc4random 相当于 Java 吗?

java - 使用 tomcat 7 运行 Web 服务时出现 ClassNotFoundException?

java 如何在 apache 服务器中运行 spark 应用程序

java - Spring Boot 不提供静态内容(Angular-CLI)来为 Tomcat 上的应用程序提供服务

spring-boot - Spring Boot WAR部署到tomcat

java - 如何在 Firebase Android 中执行查询 SQL IN 子句

主线程中的JAVA异常java.lang.NoDefFounderror : net/. ......../AbstractClock

java - war 文件中出现 NoClassDefFoundError 异常

android - Urban Airship 崩溃应用程序