Добавление библиотеки JNI в локальный репозиторий Maven
Я хочу добавить библиотеку JNI, включая файл с общим объектом (.so) в мой проект, используя Maven. К сожалению, он еще не включен в общий репозиторий, поэтому я предполагаю, что я должен сам установить его в своем локальном репозитории, чтобы он работал.
Как мне включить в себя часть встроенной части Maven, которая будет включена в мой проект (и, в конечном итоге, экспортирована с плагином-зависимостями). Это стандартное приложение J2SE (а не веб-приложение) с упаковкой .jar?
Библиотека, которую я пытаюсь добавить, junixsocket, на всякий случай, когда она помогает узнать.
Он имеет компонент .so(родной библиотеки) и компонент Java.jar.
Я столкнулся с maven-nar-plugin, который, похоже, нацелен на собственные сборки, но, похоже, больше ориентирован на создание проекта JNI из кода, чем связать стороннюю библиотеку JNI, и я не могу собрать кусочек головоломки вместе.
Как я могу:
- Установка их в моем локальном репозитории с использованием .jar в зависимости от библиотеки .so.
- Включение зависимости (в .jar и .so) в файле POM.
Спасибо.
Ответы
Ответ 1
Мой подход:
Поместите файлы .so
в репозиторий с классификатором платформы, например: sqlite3-3.7.9-linux-x86_64.so
.
Добавьте .so
зависимости для всех необходимых платформ:
<dependency>
<groupId>de.ch-werner</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.9</version>
<type>so</type>
<classifier>linux-x86_64</classifier>
</dependency>
Используйте эту конфигурацию плагина сборки maven, чтобы поместить все родные библиотеки в каталог lib/native
dist:
<dependencySet>
<outputDirectory>lib/native</outputDirectory>
<outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
<unpack>false</unpack>
<useProjectArtifact>false</useProjectArtifact>
<useStrictFiltering>false</useStrictFiltering>
<includes>
<include>*:*:dll:*</include>
<include>*:*:so:*</include>
<include>*:*:jnilib:*</include>
</includes>
</dependencySet>
Используйте этот класс для загрузки libs при запуске приложения (планирование изменения имени классификатора на триплеты GNU):
CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")
Ответ 2
Я включаю .so в банку и дополнительную общую библиотеку для платформы, прежде чем загружать ее. Таким образом, он развертывается так же, как и любая другая банка.
Пример проекта, где это выполняется, с несколькими .so для разных платформ
https://github.com/peter-lawrey/Java-Thread-Affinity
Основной класс для просмотра - https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java
Ответ 3
В качестве альтернативы распаковке ваших библиотек во время выполнения вы можете хранить их в банках в Maven, но распаковывайте их во время сборки: http://www.buildanddeploy.com/node/17.
Плагин maven-nativedependencies-plugin сделает это за вас автоматически, если вы следуете их соглашению об именах.