我正在使用 sbt 0.13 并且在使用时遇到问题级别dbjni https://github.com/fusesource/leveldbjnisbt 下的本机库(即使在问题 #358 https://github.com/sbt/sbt/issues/358已经解决了)。 A类似问题 https://stackoverflow.com/questions/17750780/scala-sbt-and-jni-library已经有报道称 sbt 0.13 应该提供解决方案,但似乎没有。所以我在这里分享我的观察。
我得到一个UnsatisfiedLinkError
与以下示例应用程序。
-
构建.sbt
name := "example"
version := "0.1"
scalaVersion := "2.10.2"
libraryDependencies += "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.7"
-
构建属性
sbt.version=0.13.0
-
示例.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。运行示例run-main Example
根据 sbt 给出
[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
任何想法为什么会有UnsatisfiedLinkError
仅在 sbt 下?
知道为什么仅在 sbt 下出现 UnsatisfiedLinkError 吗?
正如@juereth 评论的那样:
Sbt 使用神奇的类加载器来尝试防止本机加载的库的“泄漏”,并允许您多次重新导入该库。 Sbt 实际上会重命名 DLL/SO/jnilib 并将其加载到特殊的类加载器中。我不确定这是否只是一个插件功能,或者适用于所有应用程序。
所以这在某种程度上是 sbt 当前设计的预期行为。如果分叉有效,那么这就是你必须做的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)