【发布时间】:2014-04-18 23:26:30
【问题描述】:
我正在使用 sbt 0.13 并且在使用 sbt 下的 leveldbjni 本机库时遇到问题(即使在 issue #358 已解决之后)。 A similar issue 已经被报道过,sbt 0.13 应该提供一个解决方案,但它似乎没有。所以我在这里分享我的观察。
我收到了UnsatisfiedLinkError 与以下示例应用程序。
-
build.sbt
name := "example" version := "0.1" scalaVersion := "2.10.2" libraryDependencies += "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.7" -
build.properties
sbt.version=0.13.0 -
Example.scala
import org.fusesource.leveldbjni.internal._ object Example extends App { NativeDB.LIBRARY.load() // loading succeeds new NativeOptions() // UnsatisfiedLinkError under sbt }
我使用的是 Oracle JDK 1.7 和 OS X 10.8.5。在 sbt 下使用 run-main Example 运行示例会给出
[error] (run-main) java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
而使用
运行它java -cp scala-library.jar:example_2.10-0.1.jar:leveldbjni-all-1.7.jar Example
工作正常。当 Scala 在 bootclasspath 上时,应用程序甚至可以成功运行:
java -Xbootclasspath/a:scala-library.jar -cp example_2.10-0.1.jar:leveldbjni-all-1.7.jar Example
知道为什么只有在 sbt 下才有 UnsatisfiedLinkError 吗?
【问题讨论】:
-
这只是一种解决方法,但是您尝试过forking吗?
-
@gourlaysama 是的,分叉它确实有效,但正如你所说,这只是一种解决方法。无论如何,谢谢。
-
我还应该补充一点,分叉解决方法仅适用于 sbt 0.13,不适用于早期版本。
-
Sbt 正在使用魔术类加载器来尝试防止本地加载的库“泄漏”,并允许您多次重新导入库。 Sbt 实际上会重命名 DLL/SO/jnilib 并将其加载到一个特殊的类加载器中。如果这只是一个插件功能,或者适用于所有应用程序,我不肯定。我过去看到过这种情况是在不使用此功能并且我的本机库已经链接到另一个类加载器时。每次运行都会发生这种情况,还是仅在成功运行后发生?
-
@integratingweb fork 您的测试(推荐)或设置 akka.persistence.journal.leveldb.native=off(无需分叉即可工作,但应仅用于测试)