在这个 question ,讨论了如何将 jar 文件包含到 sbt 项目中。我需要一个 .jar 文件和一些 .so 库文件。
尝试1:
我可以将 jar 文件移动到我的 sbt lib/目录中,这很好,除了这个应用程序有一个小 jar,它只是 C++ 软件的包装器。我想做的事情是在 .so 库文件中,如果我将 jar 文件本身移动到 ./lib ,我会得到链接错误:
sbt:SimpleProject> run linearSalience
[info] Running linearSalience linearSalience
[error] (run-main-0) java.lang.UnsatisfiedLinkError: no java_salience in java.library.path
[error] java.lang.UnsatisfiedLinkError: no java_salience in java.library.path
[error] at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
尝试2:
我尝试将所需库的 simlinks 放入 lib/文件夹中,但这没有用。我不想将整个库复制到 lib/文件夹中,即使这样可行,因为它几乎是 2 GB;为每个项目复制它是愚蠢的。
尝试 3:
我尝试通过 sbt 的 javaOptions 设置 java.library.path,方法是将以下行添加到 build.sbt
javaOptions in run += "-Djava.library.path=/opt/path/to/lib/:/opt/path/to/sdk/java/src/"
第一个路径包含 .so 文件,第二个路径包含 .jar 文件。在这种情况下,编译器甚至找不到包(当 .jar 文件位于 sbt 的 lib/文件夹中时,这不是问题):
[info] Compiling 1 Scala source to /opt/optests/sbttest/target/scala-2.10/classes ...
[error] /opt/optests/sbttest/src/main/scala/SimpleApp.scala:6:12: object lexalytics is not a member of package com
[error] import com.lexalytics.salience.{Salience, Section, Sentence, Word}
[error] ^
[error] /opt/optests/sbttest/src/main/scala/SimpleApp.scala:23:23: not found: type Salience
[error] val session = new Salience("/opt/path/to/license.v5", "/opt/path/to/data")
[error] ^
...etc
尝试4:
我尝试设置 LD_LIBRARY_PATH 环境变量(如建议 here )
[用户@服务器 ~]$ echo $LD_LIBRARY_PATH
/opt/path/to/lib/:/opt/path/to/sdk/java/src/
结果与3中的错误相同
似乎有关此主题的所有问题都可以通过将单个 jar 文件放入 lib/或使用托管依赖项(如 here )来解决。但是我有一个没有在线支持的仅限本地存储库,它不仅仅是一个 .jar 文件。
最终,我需要将库目录放入 java.library.path,但我该怎么做呢?
注意:这不是任何仅处理 .jar 文件且未提及 .so 文件的问题的重复。
最佳答案
当您在 JVM 上的 native 库上使用 JNI 包装器时(语言无关,可以是 Java 或 Scala),库 jar 文件通常只包含 JNI 胶水代码,定义如何映射一些 java api 调用到 native 库调用。这个jar只是一个普通的库,所以可以放到/lib
sbt 文件夹像往常一样。
native 库本身应该在运行时出现在 java.library.path
中。 ,所以你很接近。正如您所建议的,您可以将 native SDK 添加到 javaOptions in run
(连同 /lib
文件夹中的 jar),它应该可以工作。
关于scala - sbt:如何将本地文件系统 jar 添加到我的项目中……还有很多 .so 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51974677/