2013-10-17 3 views
16

私はsbt 0.13を使用しています。issue #358が解決された後でも、sbtでleveldbjniネイティブライブラリを使用する際に問題があります。 A similar issueは既に報告されており、sbt 0.13は解決策を提供すべきだが、そうではないようだ。だから私はここで私の観察を共有している。sbtでネイティブライブラリとのUnsatisfiedLinkError

次のアプリケーション例で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 
    
  • import org.fusesource.leveldbjni.internal._ 
    
    object Example extends App { 
        NativeDB.LIBRARY.load() // loading succeeds 
        new NativeOptions() // UnsatisfiedLinkError under sbt 
    } 
    
Example.scala 210

私はOracle JDK 1.7とOS X 10.8.5を使用しています。

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

だけで正常に動作して、それを実行しているのに対し、SBT下run-main Exampleで例を実行すると、

[error] (run-main) java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V 

を与えます。 Scalaはブートクラスパス上にあるときにアプリケーションでも正常に実行:

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

UnsatisfiedLinkErrorのみSBTの下にありますなぜ任意のアイデア?

+2

これは単なる回避策ですが、[フォーク](http://www.scala-sbt.org/release/docs/Detailed-Topics/Forking.html)を試してみましたか? – gourlaysama

+0

@gourlaysamaはい、それは実際には機能しますが、あなたが言ったように、それは単なる回避策です。とにかくありがとう。 –

+1

また、フォークの回避策は、以前のバージョンではなく、sbt 0.13でのみ動作することを追加する必要があります。 –

答えて

5

なぜUnsatisfiedLinkErrorがsbtの下にあるのでしょうか? @juerethとして

コメント:

SBTがネイティブにロードされるライブラリの「漏洩」を防ぐためにしようと、あなたはライブラリを複数回を再インポートできるようにするために魔法のクラスローダを使用しています。 Sbtは実際にDLL/SO/jnilibの名前を変更し、特別なクラスローダにロードします。これがプラグイン機能だけの場合は肯定的ではありません。

これは、sbtの現在のデザインでは多少期待される動作です。フォークが動作する場合、それはあなたがしなければならないことです。

関連する問題