18

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

我得到UnsatisfiedLinkError了以下示例应用程序。

  • 构建.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
    
  • 例子.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

任何想法为什么UnsatisfiedLinkError只有在 sbt 下?

4

1 回答 1

7

任何想法为什么只有在 sbt 下才有 UnsatisfiedLinkError?

正如@juereth 评论的那样:

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

因此,对于当前的 sbt 设计,这在某种程度上是预期的行为。如果分叉有效,那么这就是你必须做的。

于 2014-04-18T15:26:30.787 回答