在sbt下使用本机库的UnsatisfiedLinkError

时间:2013-10-17 11:34:36

标签: scala sbt

我正在使用sbt 0.13并且在sbt下使用leveldbjni本机库时遇到问题(即使在issue #358已解决之后)。已经报告了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的任何想法?

1 个答案:

答案 0 :(得分:6)

  

为什么只有在sbt下才会出现UnsatisfiedLinkError?

正如@juereth评论的那样:

  

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

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