[英]Scala SBT and JNI library
我正在Scala
中編寫一個簡單的應用程序,該應用程序通過leveldbjni
庫使用leveldb數據庫。 我的build.sbt
文件如下所示:
name := "Whatever"
version := "1.0"
scalaVersion := "2.10.2"
libraryDependencies ++= Seq(
"org.iq80.leveldb" % "leveldb-api" % "0.6",
"org.fusesource.leveldbjni" % "leveldbjni-all" % "1.7"
)
然后, Object
負責創建數據庫。 不幸的是,如果我運行該程序, hawtjni
返回一個java.lang.UnsatisfiedLinkError
,它是由hawtjni
在leveldbjni
利用的hawtjni
庫leveldbjni
的。
也可以從scala控制台輕松觸發該錯誤:
scala> import java.io.File
scala> import org.iq80.leveldb._
scala> import org.fusesource.leveldbjni.JniDBFactory._
scala> factory.open(new File("test"), new Options().createIfMissing(true))
java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
at org.fusesource.leveldbjni.internal.NativeOptions.init(Native Method)
at org.fusesource.leveldbjni.internal.NativeOptions.<clinit>(NativeOptions.java:54)
at org.fusesource.leveldbjni.JniDBFactory$OptionsResourceHolder.init(JniDBFactory.java:98)
at org.fusesource.leveldbjni.JniDBFactory.open(JniDBFactory.java:167)
at .<init>(<console>:15)
...
scala> System getProperty "java.io.tmpdir"
res2: String = /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/
我不明白發生了什么事,因為該庫已從jar文件中正確提取,但由於某些原因未加載。
$ file /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/lib*
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib: Mach-O universal binary with 2 architectures
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib (for architecture i386): Mach-O dynamically linked shared library i386
我認為問題可能與sbt所使用的類加載器有關,但是我不確定,因為我對scala比較陌生。
更新
仍然沒有找到肇事者或罪魁禍首。 無論如何,實際上可以找到並正確加載該庫,因為我可以執行以下命令:
scalac> import org.fusesource.leveldbjni.internal.NativeDB
scalac> NativeDB.LIBRARY.load()
該錯誤是由於init()
函數所致,根據hawtjni
文檔 ,該函數負責將所有標注為具有常量value的靜態字段設置為常量字段 。 仍然可以通過鍵入以下內容觸發異常:
scalac> import org.fusesource.leveldbjni.internal.NativeOptions
scalac> new NativeOptions()
java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
at org.fusesource.leveldbjni.internal.NativeOptions.init(Native Method)
at org.fusesource.leveldbjni.internal.NativeOptions.<clinit>(NativeOptions.java:54)
at .<init>(<console>:9)
顯然,這是此sbt問題頁中記錄的已知問題。 根據eventsourced文檔 ,我已經實現了一個自定義的run-nobootcp
命令,該命令在不將Scala庫添加到引導類路徑的情況下執行代碼。
這應該可以解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.