我正在使用sbt 0.13,并且在sbt下使用leveldbjni本机库存在问题(即使在问题#358已解决之后)。一个类似的问题已经被报告为这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。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设计的某种预期行为。如果分叉有效,那就是您要做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句