2012-04-09 18 views
13

Deseo agregar una biblioteca JNI, incluido su archivo de objeto compartido (.so) a mi proyecto utilizando Maven. Desafortunadamente todavía no está en un repositorio público, así que supongo que tengo que instalarlo en mi repositorio local para que funcione.Agregar una biblioteca JNI al Repositorio Maven local

¿Cómo hago para incluir la parte nativa en Maven que se incluirá en mi proyecto (y finalmente se exportará con el complemento de copia-dependencias). Esta es una aplicación J2SE estándar (no una aplicación web), con el paquete .jar?

La biblioteca que estoy tratando de agregar es junixsocket, por si acaso esto ayuda a saber. Tiene un componente .so (biblioteca nativa) y el componente Java .jar.

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 del código, en lugar de agrupar una biblioteca JNI de terceros, y no puedo juntar el rompecabezas .

¿Cómo hago para:

  1. Instalación de estos en mi repositorio local, teniendo el .jar en función de la biblioteca .so.
  2. Incluyendo la dependencia (en .jar y .so) en el archivo POM.

Gracias.

Respuesta

5

Incluyo .so en el contenedor y extra la biblioteca compartida específica de la plataforma antes de cargarlo. De esta forma se implementa como cualquier otro jar.

Un ejemplo de un proyecto en el que se hace esto, con .so múltiple para diferentes plataformas es https://github.com/peter-lawrey/Java-Thread-Affinity

La clase principal a tener en cuenta es https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java

+0

¿Cómo se implementa entonces un ¿Y asegúrese de que la biblioteca nativa se coloque a la derecha de la BIBLIOTECA? – jbx

+0

No, carga en un subdirectorio de 'java.io.tmpdir' y lo carga con un nombre de ruta completo. –

8

Mi enfoque:

Ponga .so archivos al repositorio con la plataforma clasificador específico, como este: sqlite3-3.7.9-linux-x86_64.so. Añadir .so dependencias 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> 

Utilice esta experta en el montaje plug-in de configuración para poner todas las librerías nativas en lib/native directorio de ustedes 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>  

Uso this class para cargar librerías en el arranque de aplicaciones (planea cambiar el nombre del clasificador a GNU triplets):

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

¿Es posible agregar el .so con el clasificador específico de plataforma con el comando de instalación mvn normal? – jbx

+0

@jbx ¿Quizás te refieres a 'mvn deploy'? Lo usé solo para los deps construidos por el propio Maven. Nuestros deps JNI se construyen sin maven, y se cargan en el repositorio maven con cURL mediante simple script bash. – alexkasko

+0

No, quise decir mvn install. Normalmente hago esto para bibliotecas de terceros que no están en el repositorio de maven. http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html Así que esencialmente lo que deseo hacer es incluir .so con el jar de terceros. – jbx

Cuestiones relacionadas