2013-10-17 16 views
16

Tôi đang sử dụng sbt 0.13 và gặp sự cố khi sử dụng thư viện gốc leveldbjni dưới sbt (ngay cả sau khi issue #358 đã được giải quyết). A similar issue đã được báo cáo cho sbt 0,13 nên cung cấp một giải pháp nhưng có vẻ như nó không. Vì vậy, tôi đang chia sẻ những quan sát của tôi ở đây.UnsatisfiedLinkError với thư viện gốc theo sbt

Tôi nhận được UnsatisfiedLinkError bằng ứng dụng ví dụ sau.

  • 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 
    } 
    

Tôi đang sử dụng Oracle JDK 1.7 và OS X 10.8.5. Chạy ví dụ với run-main Example dưới SBT cho

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

trong khi chạy nó với

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

chỉ hoạt động tốt. Ứng dụng này thậm chí chạy thành công khi Scala là trên bootclasspath:

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

Bất cứ ý tưởng tại sao có một UnsatisfiedLinkError chỉ dưới SBT?

+2

Đây chỉ là giải pháp thay thế, nhưng bạn đã thử [cố định] (http://www.scala-sbt.org/release/docs/Detailed-Topics/Forking.html) chưa? – gourlaysama

+0

@gourlaysama yes, với forking nó thực sự hoạt động nhưng, như bạn nói, nó chỉ là một workaround. Dù sao cũng cảm ơn bạn. –

+1

Tôi cũng nên thêm rằng workaround forking chỉ hoạt động với sbt 0.13, không phải với các phiên bản trước đó. –

Trả lời

5

Bất kỳ ý tưởng nào tại sao có UnsatisfiedLinkError chỉ dưới sbt?

Như @juereth nhận xét:

SBT đang sử dụng classloaders ma thuật để cố gắng ngăn chặn "rò rỉ" của thư viện tải bản xứ, và cho phép bạn tái nhập viện nhiều lần. Sbt sẽ thực sự đổi tên tệp DLL/SO/jnilib và tải nó trong một trình nạp lớp đặc biệt. Tôi không tích cực nếu đây chỉ là một tính năng plugin, hoặc một cái gì đó cho tất cả các ứng dụng.

Vì vậy, đây là hành vi có phần mong đợi với thiết kế sbt hiện tại. Nếu forking làm việc, thì đó là những gì bạn phải làm.

Các vấn đề liên quan