java maven java-native-interface maven-nar-plugin

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:

  1. Instalando estos en mi repositorio local, teniendo el .jar dependiendo de la biblioteca .so.
  2. Incluyendo la dependencia (en .jar y .so) en el archivo POM.

Gracias.



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")