sbt: Как я могу добавить в свой проект jar локальной файловой системы, а также множество библиотек .so?

В этом вопросе обсуждается, как включить файл jar в проект sbt. Мне нужен как файл .jar, так и некоторые файлы библиотеки .so.

Попытка 1:

Я могу переместить файл jar в свой каталог sbt lib/, и это здорово, за исключением того, что у этого приложения есть небольшой jar, который является просто оболочкой для программного обеспечения C++. То, что я хочу сделать, находится в файлах библиотеки .so, и если я перемещу файл jar в ./lib сам по себе, я получаю ошибки связывания:

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)

Попытка 2:

Я пробовал помещать симлинки на нужные библиотеки в папку lib/, но это не сработало. Я не хочу копировать всю библиотеку в папку lib/, даже если это сработает, так как это почти 2 ГБ; и было бы глупо копировать его для каждого проекта.

Попытка 3:

Я попытался установить java.library.path через javaOptions sbt, добавив следующую строку в build.sbt

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

Первый путь содержит файлы .so, второй — файл .jar. В этом случае компилятор даже не смог найти пакеты (что не было проблемой, пока файл .jar находился в папке lib/ 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

Попытка 4:

Я пытаюсь установить переменную среды LD_LIBRARY_PATH (как было предложено здесь)

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

В результате та же ошибка, что и в 3


Похоже, что все вопросы по этой теме решаются либо помещением отдельных jar-файлов в lib/, либо использованием управляемых зависимостей (как здесь). Но у меня есть локальный репозиторий без онлайн-поддержки, это больше, чем один файл .jar.

В конечном итоге мне нужно получить каталог библиотеки в java.library.path, но как мне это сделать?

Примечание. Это не дубликат какого-либо вопроса, касающегося только файлов .jar и не упоминающего файлы .so.


person kingledion    schedule 22.08.2018    source источник


Ответы (1)


Когда вы используете оболочку JNI поверх нативной библиотеки на JVM (это не имеет значения на языке, это может быть Java или Scala), файл jar библиотеки обычно содержит только связующий код JNI, определяющий, как отображать некоторые вызовы java API на вызовы родной библиотеки. Этот jar представляет собой обычную библиотеку, поэтому его можно кинуть в папку /lib sbt, как обычно.

Сама нативная библиотека должна присутствовать во время выполнения внутри java.library.path, так что вы были достаточно близки. Как вы предложили, вы можете добавить собственный SDK в javaOptions in run (вместе с банкой в ​​папке /lib), и он должен работать.

person shutty    schedule 16.09.2018