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

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

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

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

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

Как мне поступить:

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

Благодарю.

3 ответа

Мой подход:

Положил .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>    

Используйте этот класс для загрузки библиотек при запуске приложения (планирование изменения имен классификаторов на триплеты GNU):

CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")

Я включаю.so в jar и добавляю общую библиотеку для конкретной платформы перед загрузкой. Таким образом, он развернут так же, как и любой другой сосуд.

Примером проекта, где это делается, с несколькими.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

В качестве альтернативы распаковке ваших библиотек во время выполнения вы можете хранить их в виде файлов jar в Maven, но распаковывать их во время сборки: http://www.buildanddeploy.com/node/17.

Плагин maven-nativedependencies-plugin будет делать это автоматически, если вы соблюдаете их соглашение об именах.

Другие вопросы по тегам