2011-09-22 21 views
6

tengo el siguiente escenario:proyecto Maven con dependencia nativa y la copia de archivos

mibiblioteca es una biblioteca (por el que tengo las fuentes, así que me gustaría ponerlas en un proyecto Maven mibiblioteca: mibiblioteca por ejemplo,) Esta biblioteca tiene una dependencia de jar para la que solo tengo el jar, y no se encuentra en el repositorio de Maven (y tampoco quiero instalarlo allí). Para hacerlo compilar, algo como esto funcionaría: agregue el archivo jar al proyecto mylib en una carpeta "lib", p. "lib/thirdpartylib.jar" y en pom.xml de mylib, agregue una dependencia con el grupo/artefacto/versión elegido por sí mismo y una entrada "<scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>". El proyecto mylib compilará bien.

Tenga en cuenta que mylib también tiene una dependencia en tiempo de ejecución de un archivo dll, digamos thirdparty.dll. Pero para compilación esto no es importante.

Sin embargo, ahora lo que estoy preguntando cómo lograr los siguientes:

Algún otro proyecto, por ejemplo, proyecto "X", que utiliza mibiblioteca, necesitará el

- mylib.jar 
- thirdpartylib.jar 
- thirdpartylib.dll 

,

y va a tener que ajustar la java.library.path al directorio (por ejemplo, "") tal que el jar y dll de terceros son encontrados por la máquina virtual ejecutora.

Mi preocupación es esta: me gustaría que las cosas jaripart/dll de terceros sean responsabilidad del proyecto mylib. Es decir. Quiero definir el conocimiento, que necesita copiar el archivo jar y dll de terceros a la carpeta de destino y que java.library.path se refiere a ellos, para ser parte del proyecto mylib (el mylib pom sabe cómo debe ser la cosa) utilizado en otros proyectos). Sin embargo, quiero que este conocimiento (es decir, copiar instrucciones, independientemente de cómo se hacen exactamente en Maven) para ser transferido transitoriamente a cualquier otro proyecto utilizando mylib, como X, por ejemplo. ¿Es eso de alguna manera posible?

[Mi solución de hack por el momento sería que tengo una copia de las cosas de terceros en X, pero incluso entonces no sé cómo copiar/tratar el archivo dll, así que tendría que escribir un archivo Léame diciendo que el archivo dll tiene que ser copiado a la carpeta bin de la VM ejecutante).

¡Cualquier sugerencia es apreciada!

Respuesta

2

La idea base es la siguiente:

  • Maven es bueno en el manejo con un resultado por Maven POM.
  • Es posible tener bibliotecas y dependencias para estas bibliotecas solo en sus repositorios locales.

lo que tiene que hacer los siguientes pasos:

  1. Definir para la biblioteca adicional de un proyecto separado (o un módulo en su proyecto) y definir la biblioteca como el resultado.
  2. Cambie su POM para que este POM ahora dependa del nuevo proyecto.
  3. Haga los mismos pasos para su DLL (consulte la publicación Managing DLL dependencies with Maven) cómo hacerlo).
  4. Implemente su biblioteca adicional y su DLL en su repositorio local.

Ahora debería poder usar Maven para el proceso de compilación de nuevo, y mediante el uso de complementos adicionales como el maven-assembly-plugin, puede empaquetar todos juntos.

13

me gustaría sugerir convertir los archivos en módulos Maven, instalándolos en el repositorio local con el Maven install plug-in

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib \ 
    -Dversion=1.0 \ 
    -Dfile=thirdpartylib.jar 

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib-runtime \ 
    -Dversion=1.0 \ 
    -Dpackaging=dll 
    -Dfile=thirdpartylib.dll 

Una de las cosas interesantes acerca de este enfoque es que el Maven POM se generará automáticamente.

El proyecto mibiblioteca declara ahora los módulos de terceros como dependencias normales en que es archivo POM:

<dependencies> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib-runtime</artifactId> 
     <version>1.0</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 

Ahora, cuando el módulo mibiblioteca es referenciado por otros módulos (como dependencia) los módulos de terceros se también se puede descargar como dependencias transitivas.

+0

Me quedo con tu solución, gracias hombre. – mtrovo

Cuestiones relacionadas