【问题标题】:Java can't find native libraries when running Clojure JAR运行 Clojure JAR 时 Java 找不到本机库
【发布时间】:2016-12-28 02:41:49
【问题描述】:

我正在处理的项目是一个服务器端 Clojure 项目,其中 Leiningen 作为我的构建工具。

当我尝试运行使用 Leiningen 的 uberjar 创建的 JAR 时,会出现问题。 JAR 依赖于我放置在以下位置的一些本机库:/usr/lib/nativedeps/so

在运行 JAR 之前,我将环境变量 LD_LIBRARY_PATH 与本机库路径一起导出,以便链接器知道在哪里查找本机库:

export LD_LIBRARY_PATH=/usr/lib/ctch/so

然后我运行 JAR:

java -jar externalapibe-0.1.0-standalone.jar 3001

抛出异常:

java.lang.UnsatisfiedLinkError: java.library.path 中没有 JavaASAPSDK

这意味着链接器无法找到 JavaASAPSDK(它是 /usr/lib/nativedeps/so 中的本机库之一)并且我需要指定java.library.path 中的库路径。所以我跑了:

java -Djava.library.path=/usr/lib/nativedeps/so -jar externalapibe-0.1.0-standalone.jar 3001

抛出异常:

java.lang.UnsatisfiedLinkError: /usr/lib/nativedeps/so/libJavaASAPSDK.so:libprotobuf.so.6:不能 打开共享对象文件:没有这样的文件或目录

这意味着找到了 JavaASAPSDK 库,但另一个名为 libprotobuf.so.6 的库(JavaASAPSDK 依赖于该库)无法找到找到了。

问题是两个库都在同一个目录中!

关于什么可能导致这个问题以及如何解决它的任何想法?

【问题讨论】:

  • lddso 文件中给出了什么?
  • 问题中的 LD_LIBRARY_PATH 与 java.library.path 不同。故意的?

标签: jar clojure leiningen java.library.path


【解决方案1】:

我通过删除解决了问题:

libprotobuf.so.6

并创建一个名为“libprotobuf.so.6”的符号链接到一个显然与 libprotobuf.so.6 相同的库,名为 libprotobuf.so.6.0.0。

然后我在:/etc/ld.so.conf.d/中创建了一个配置文件

touch /etc/ld.so.conf.d/externalapibe.conf

并在其中写下了我的原生库的路径:

/usr/lib/nativedeps/so

然后我跑了:

ldconfig -v | grep /usr/lib/nativedeps/so

从 'externalapibe.conf' 中读取我的原生 deps 的路径并在其中重新绑定原生库。

这似乎起作用了。

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多