2013-10-17 6 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 
    } 
    
,691,363 Example.scala210

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 

을 제공합니다. 이 응용 프로그램은 심지어 스칼라 bootclasspath에에있을 때 성공적으로 실행 :

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

왜 UnsatisfiedLinkError가 sbt 미만인가요? @juereth 주석으로

:

SBT 네이티브로드 라이브러리의 "누출"을 방지하기 위해 시도하고 라이브러리를 여러 번 다시 가져올 수 있도록 마법 클래스 로더를 사용하고 있습니다. Sbt는 실제로 DLL/SO/jnilib의 이름을 바꾸고 특수 클래스 로더에로드합니다. 이것이 단지 플러그인 기능이거나 모든 앱을위한 것이라면 저는 긍정적이지 않습니다.

그래서 이것은 현재 sbt 디자인에서 예상되는 동작입니다. 포크가 작동한다면, 그게 당신이해야 할 일입니다.

관련 문제