sbt 下的本机库出现 UnsatisfiedLinkError

2024-01-03

我正在使用 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(使用前将#替换为@)

sbt 下的本机库出现 UnsatisfiedLinkError 的相关文章

随机推荐