i writing simple app in scala uses leveldb database through leveldbjni library. build.sbt file looks this:
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" ) an object responsible creating database. unfortunately if run program java.lang.unsatisfiedlinkerror, raised hawtjni library leveldbjni exploits under hood.
the error can triggered scala console:
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 @ org.fusesource.leveldbjni.internal.nativeoptions.init(native method) @ org.fusesource.leveldbjni.internal.nativeoptions.<clinit>(nativeoptions.java:54) @ org.fusesource.leveldbjni.jnidbfactory$optionsresourceholder.init(jnidbfactory.java:98) @ org.fusesource.leveldbjni.jnidbfactory.open(jnidbfactory.java:167) @ .<init>(<console>:15) ... scala> system getproperty "java.io.tmpdir" res2: string = /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/ i can't understand going on since library getting correctly extracted jar file not getting loaded reasons.
$ file /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/lib* /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/libleveldbjni-1.7.jnilib: mach-o universal binary 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 i think problem related classloader sbt employs not sure since relatively new scala.
update
still didn't find or culprit. anyway library found , correctly loaded, since can execute following commands:
scalac> import org.fusesource.leveldbjni.internal.nativedb scalac> nativedb.library.load() the error somehow due init() function according hawtjni documentation responsible setting all static fields annotated constant fields constant value. exception can still triggered typing:
scalac> import org.fusesource.leveldbjni.internal.nativeoptions scalac> new nativeoptions() java.lang.unsatisfiedlinkerror: org.fusesource.leveldbjni.internal.nativeoptions.init()v @ org.fusesource.leveldbjni.internal.nativeoptions.init(native method) @ org.fusesource.leveldbjni.internal.nativeoptions.<clinit>(nativeoptions.java:54) @ .<init>(<console>:9)
apparently known problem documented in sbt issue page. have implemented, according eventsourced documentation, custom run-nobootcp command executes code without adding scala library boot classpath.
this should solve problem.
Comments
Post a Comment