2013-10-17 50 views
16

我使用sbt 0.13和有問題使用sbt下的leveldbjni本地庫(即使在issue #358已解決後)。 A similar issue已經被報道,其中sbt 0.13應該提供一個解決方案,但它似乎沒有。所以我在這裏分享我的觀察。UnsatisfiedLinkError與本地庫下sbt

我得到一個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是在引導類路徑:

java -Xbootclasspath/a:scala-library.jar -cp example_2.10-0.1.jar:leveldbjni-all-1.7.jar Example 

任何想法,爲什麼有一個UnsatisfiedLinkError僅在SBT?

+2

這只是一種解決方法,但您是否嘗試過[forking](http://www.scala-sbt.org/release/docs/Detailed-Topics/Forking.html)? – gourlaysama

+0

@gourlaysama是的,與分叉它實際上工作,但正如你所說,這只是一個解決方法。不管怎麼說,還是要謝謝你。 –

+1

我還應該補充說明,分流解決方法只適用於sbt 0.13,而不適用於早期版本。 –

回答

5

任何想法爲什麼只有在sbt下有UnsatisfiedLinkError?

由於@juereth評論:

SBT使用魔法類加載器試圖阻止本地加載庫的「泄密」,讓你到圖書館多次重新導入。 Sbt實際上會重命名DLL/SO/jnilib並將其加載到特殊的類加載器中。我不積極,如果這只是一個插件功能,或所有應用程序的東西。

所以這是與目前sbt的設計有些預期的行爲。如果分叉工作,那麼這就是你必須做的。