0

In this question, there is discussion of how to include jar file into an sbt project. I need both a .jar file and some .so library files.

Attempt 1:

I can move the jar file into my sbt lib/ directory, which is great, except that this application has a small jar which is just a wrapper around C++ software. The stuff I want to do is in the .so library files, and if I move the jar file to ./lib by itself, I get linking errors:

sbt:SimpleProject> run linearSalience
[info] Running linearSalience linearSalience
[error] (run-main-0) java.lang.UnsatisfiedLinkError: no java_salience in java.library.path
[error] java.lang.UnsatisfiedLinkError: no java_salience in java.library.path
[error]         at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)

Attempt 2:

I have tried putting simlinks to the desired libraries into the lib/ folder, but that didn't work. I don't want to copy the entire library into the lib/ folder, even if that would work, since it is almost 2 GB; and it would be silly to copy it for each project.

Attempt 3:

I tried setting java.library.path through the javaOptions of sbt, by adding the following line to build.sbt

javaOptions in run += "-Djava.library.path=/opt/path/to/lib/:/opt/path/to/sdk/java/src/"

The first path contains the .so files, the second the .jar file. In this case, the compiler couldn't even find the packages (which was not a problem while the .jar file was in the lib/ folder of sbt):

[info] Compiling 1 Scala source to /opt/optests/sbttest/target/scala-2.10/classes ...
[error] /opt/optests/sbttest/src/main/scala/SimpleApp.scala:6:12: object lexalytics is not a member of package com
[error] import com.lexalytics.salience.{Salience, Section, Sentence, Word}
[error]            ^
[error] /opt/optests/sbttest/src/main/scala/SimpleApp.scala:23:23: not found: type Salience
[error]     val session = new Salience("/opt/path/to/license.v5", "/opt/path/to/data")
[error]                       ^
...etc

Attempt 4:

I try to set the LD_LIBRARY_PATH environment variable (as suggested here)

[user@server ~]$ echo $LD_LIBRARY_PATH /opt/path/to/lib/:/opt/path/to/sdk/java/src/

The result is the same error as in 3


It seems like all the questions on this topic are resolved by either putting single jar files into lib/ or using managed dependencies (as here). But I have a local-only repository with no online support, that is more than a single .jar file.

Ultimately, I need to get the library directory into java.library.path, but how do I do that?

Note: This is not a duplicate of any question that deals with only .jar files and has no mention of .so files.

Cœur
  • 37,241
  • 25
  • 195
  • 267
kingledion
  • 2,263
  • 3
  • 25
  • 39

1 Answers1

1

When you use a JNI wrapper over a native library on JVM (it doesn't matter on the language, it can be Java or Scala), the library jar file usually contains only the JNI glue code, defining how to map some java api calls to the native library calls. This jar is just a regular library, so it can be dropped to the /lib sbt folder as usual.

The native library itself should be present at runtime within the java.library.path, so you were quite close. As you suggested, you can add native SDK to the javaOptions in run (along with the jar in /lib folder) and it should work.

shutty
  • 3,298
  • 16
  • 27