在sbt下使用本机库的UnsatisfiedLinkError

Mar*_*ser 18 scala sbt

我正在使用sbt 0.13并且在sbt下使用leveldbjni本机库时遇到问题(即使问题#358已经解决).一个类似的问题已经被报告为这SBT 0.13应该提供一个解决方案,但它似乎没有.所以我在这里分享我的观察.

我正在UnsatisfiedLinkError使用以下示例应用程序.

我正在使用Oracle JDK 1.7和OS X 10.8.5.run-main Example在sbt下运行示例给出

[error] (run-main) java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
Run Code Online (Sandbox Code Playgroud)

而运行它

java -cp scala-library.jar:example_2.10-0.1.jar:leveldbjni-all-1.7.jar Example
Run Code Online (Sandbox Code Playgroud)

工作正常.当Scala位于bootclasspath时,应用程序甚至可以成功运行:

java -Xbootclasspath/a:scala-library.jar -cp example_2.10-0.1.jar:leveldbjni-all-1.7.jar Example
Run Code Online (Sandbox Code Playgroud)

任何想法,为什么UnsatisfiedLinkError只有一个sbt?

Eug*_*ota 7

有什么想法为什么只有sbt下有一个UnsatisfiedLinkError?

正如@juereth评论的那样:

Sbt使用魔术类加载器来尝试防止本机加载库的"泄漏",并允许您多次重新导入库.Sbt实际上会重命名DLL/SO/jnilib并将其加载到一个特殊的类加载器中.如果这只是一个插件功能,或者适合所有应用的东西,我不肯定.

因此,对于sbt的当前设计,这是一些预期的行为.如果分叉有效,那么这就是你必须要做的事情.