UnsatisfiedLinkError с родной библиотекой под sbt

Я использую sbt 0.13 и имею проблемы с использованием leveldbjni родной библиотеки под sbt (даже после проблема № 358 была разрешена). A аналогичная проблема уже сообщалось, для чего sbt 0.13 должен предоставить решение, но, похоже, это не так. Поэтому я делюсь своими наблюдениями здесь.

Я получаю 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. Запуск примера с 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 находится на пути bootclass:

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

Любые идеи, почему существует UnsatisfiedLinkError только под sbt?

Ответы

Ответ 1

Любые идеи, почему существует UnsatisfiedLinkError только под sbt?

Как заметил @juereth:

Sbt использует волшебные загрузчики классов, чтобы попытаться предотвратить "утечки" собственных загруженных библиотек и позволить вам повторно импортировать библиотеку несколько раз. Sbt фактически переименует DLL/SO/jnilib и загрузит его в специальный загрузчик классов. Я не уверен, что это только плагин, или что-то для всех приложений.

Итак, это несколько ожидаемое поведение с текущим дизайном sbt. Если работает forking, то что вы должны делать.