【问题标题】:Loading native library with Spring Boot使用 Spring Boot 加载本机库
【发布时间】:2019-02-03 22:20:19
【问题描述】:

我有一个加载原生库的简单 Spring Boot 项目。问题是我不知道在运行应用程序时如何指定本机库的路径。

我已经阅读了大量解释如何设置java.library.path 的帖子,但每一个都指向

java.lang.UnsatisfiedLinkError: /path/to/lib/libconnector.so: libconnector.so: cannot open shared object file: No such file or directory

如果我从命令行按顺序运行这两个命令,项目就可以工作:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib
./gradlew bootRun

库已加载并可以运行。但我无法在我的 gradle 文件中指定库路径。我试过了

run {
    systemProperty 'java.library.path', file('/path/to/lib')
}

bootRun {
    systemProperty 'java.library.path', file('/path/to/lib')
}

以及它的各种变体。还尝试将 VM 参数添加到我的 IDE 等,但没有任何效果。有人可以解释我做错了什么吗?

这是我加载本机库的方式(位于$projectRoot/lib):

static {
        // load connector library
        File lib = new File("lib/" + System.mapLibraryName("connector"));
        System.load(lib.getAbsolutePath());
}

【问题讨论】:

    标签: java spring-boot gradle


    【解决方案1】:

    你可以简单地使用:

    dependencies {
        compile files('libs/something_local.jar')
    }
    

    【讨论】:

    • 这是一个原生的 .so 库,不是 java 依赖,所以这种方法不起作用。我需要能够使用 JNI 加载它。它需要在java.library.path
    【解决方案2】:

    我终于解决了我的问题。在运行应用程序时,我应该将 LD_LIBRARY_PATH 作为环境变量而不是 java.library.path 作为系统属性传递。

    以下 Gradle 修改解决了我的问题:

    tasks.withType(JavaExec) {
        environment('LD_LIBRARY_PATH', 'lib')
    }
    

    【讨论】:

      【解决方案3】:

      你可以写一个init方法来自动设置java.library.path, 这里有一些代码:

          String path = "/path/to/lib";
          String path = System.getProperty("java.library.path");
          // if os is windows
              path += ";" + classPath.getCanonicalPath();
          // if os is linux
              path += ":" + classPath.getCanonicalPath();
          System.setProperty("java.library.path", path);
      

      注意:先运行这个方法。

      【讨论】:

        【解决方案4】:

        尝试从你的类中加载库(只是为了测试)

        注意:我不确定,但如果你需要使用 so 文件,你必须在 linux 操作系统上。

        public class Test {
               static {
            try {
        
                System.loadLibrary("yourSohere");
               // or System.load("/path/to/lib.so");
            }
          }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-18
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-10
          • 1970-01-01
          • 2012-01-11
          相关资源
          最近更新 更多