Подтвердить что ты не робот

Добавление библиотеки JNI в локальный репозиторий Maven

Я хочу добавить библиотеку JNI, включая файл с общим объектом (.so) в мой проект, используя Maven. К сожалению, он еще не включен в общий репозиторий, поэтому я предполагаю, что я должен сам установить его в своем локальном репозитории, чтобы он работал.

Как мне включить в себя часть встроенной части Maven, которая будет включена в мой проект (и, в конечном итоге, экспортирована с плагином-зависимостями). Это стандартное приложение J2SE (а не веб-приложение) с упаковкой .jar?

Библиотека, которую я пытаюсь добавить, junixsocket, на всякий случай, когда она помогает узнать. Он имеет компонент .so(родной библиотеки) и компонент Java.jar.

Я столкнулся с maven-nar-plugin, который, похоже, нацелен на собственные сборки, но, похоже, больше ориентирован на создание проекта JNI из кода, чем связать стороннюю библиотеку JNI, и я не могу собрать кусочек головоломки вместе.

Как я могу:

  • Установка их в моем локальном репозитории с использованием .jar в зависимости от библиотеки .so.
  • Включение зависимости (в .jar и .so) в файле POM.

Спасибо.

4b9b3361

Ответ 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 сделает это за вас автоматически, если вы следуете их соглашению об именах.