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, то что вы должны делать.