java - Agregar una biblioteca JNI al repositorio local de Maven
java-native-interface maven-nar-plugin (3)
Como alternativa al desempaque de sus bibliotecas en tiempo de ejecución, puede almacenarlas como jars en Maven, pero desempaquetarlas en el momento de la compilación: http://www.buildanddeploy.com/node/17 .
El maven-nativedependencies-plugin lo hará por usted automáticamente, siempre y cuando siga su convención de nomenclatura.
Deseo agregar una biblioteca JNI, incluido su archivo de objeto compartido (.so) a mi proyecto usando Maven. Desafortunadamente, aún no está en un repositorio público, así que creo que tengo que instalarlo en mi repositorio local para que funcione.
¿Cómo hago para incluir la parte nativa en Maven que se incluirá en mi proyecto (y eventualmente se exportará con el complemento de copia-dependencias)? Esta es una aplicación J2SE estándar (no una aplicación web), con empaquetado .jar?
La biblioteca que estoy tratando de agregar es junixsocket , por si junixsocket es junixsocket saberlo. Tiene un componente .so (biblioteca nativa) y el componente .jar de Java.
Me encontré con maven-nar-plugin que parece apuntar a compilaciones nativas, pero parece estar más orientado a construir un proyecto JNI a partir de código, en lugar de agrupar una biblioteca JNI de terceros, y no puedo armar el rompecabezas. .
¿Cómo hago para:
- Instalando estos en mi repositorio local, teniendo el .jar dependiendo de la biblioteca .so.
- Incluyendo la dependencia (en .jar y .so) en el archivo POM.
Gracias.
Incluyo .so en el jar y extra la biblioteca compartida específica de la plataforma antes de cargarla. De esta manera se implementa como cualquier otro jar.
Un ejemplo de un proyecto donde se realiza esto, con múltiples .so para diferentes plataformas es https://github.com/peter-lawrey/Java-Thread-Affinity
La clase principal a considerar es https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java
Mi acercamiento:
Coloque los archivos .so
en el repositorio con un clasificador específico de la plataforma, como este: sqlite3-3.7.9-linux-x86_64.so
. Agregue dependencias .so
para todas las plataformas requeridas:
<dependency>
<groupId>de.ch-werner</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.9</version>
<type>so</type>
<classifier>linux-x86_64</classifier>
</dependency>
Use esta configuración de plugin de ensamblaje de Maven para colocar todas las librerías nativas en el directorio lib/native
de su 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>
Use esta clase para cargar libs en el inicio de la aplicación (planea cambiar el nombre del clasificador a tripletes de GNU ):
CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")