2012-04-09 23 views
6

Actualmente estoy en medio de la conversión de un gran proyecto de varios módulos (~ 100 submódulos) para usar Maven. Actualmente usamos Ant + Ivy.Manejo inteligente de dependencias nativas con Maven

Hasta ahora no han surgido problemas importantes y me siento cómodo de que Maven siga siendo una buena opción. Sin embargo, me pregunto si existe una forma mejor de manejar las dependencias nativas.

Hasta ahora he llegado a las siguientes conclusiones.

  1. Lo mejor es instalar cada dependencia nativa en el repositorio maven como una biblioteca independiente o un paquete archivado que contiene varias dependencias.
  2. En lugar de perderse en la declaración de cada dependencia con el plugin de dependencia Maven, he optado por dar a cada uno un clasificador (por ejemplo nativos en Win32) y utilizar lo siguiente en el POM padres:

     <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-dependency-plugin</artifactId> 
         <version>2.4</version> 
         <executions> 
          <execution> 
           <id>copy</id> 
           <phase>compile</phase> 
           <goals> 
            <goal>copy-dependencies</goal> 
           </goals> 
           <configuration> 
            <includeScope>runtime</includeScope> 
            <includeClassifiers>natives-win32</includeClassifiers> 
            <outputDirectory>${project.build.directory}/natives</outputDirectory> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
    

Hasta ahora, esta parece ser una solución simple y completa que no requiere mucha confusión para agregar nuevas dependencias nativas. También me ofrece una solución simple y completa para administrar nativos. Lo único que debo hacer es asegurarme de que mi directorio/native/esté definido en java.library.path.

Una cosa que me molesta (un poco) acerca de este enfoque es que todas mis dependencias nativas se copian en cada submódulo que expresa una dependencia transitiva sobre ellas, mientras mis bibliotecas jar felices se agregan al classpath al que se hace referencia donde se sientan en mi repositorio local (no se requiere copia).

No hay forma de ser más inteligente al respecto y hacer referencia a mis nativos desde su ubicación de repositorio (asumiendo que no los tengo archivados, es decir, dll). Eso ahorraría un montón de copias innecesarias.

¿Hay algún otro posible problema que me preocupe con el enfoque anterior?

+0

¿Cómo resolviste eso a través de Ivy? ¿La forma en que describes eso? – khmarbaise

+0

Parece que se resuelve bastante mal con nuestras configuraciones de Ivy. En primer lugar, las configuraciones de depuración/ejecución para eclipse configuran las dependencias de tiempo de ejecución haciendo referencia a cada una en un repositorio compartido que es un directorio mapeado en cada máquina de desarrollo. Cuando se despliegan o se prueban, los scripts ant y toman las dependencias según sea necesario. Es un desastre. – S73417H

+0

Hmmm, me gusta su solución.Parece que lo que realmente quieres es un objetivo adicional para el complemento de dependencias que establece que una propiedad sea la lista de rutas de las dependencias resueltas. Esa sería la última pieza del rompecabezas. Debería ser fácil, ¿por qué no apuñalar un parche? Píseme si tiene éxito escribiendo ese parche y echaré un vistazo a su aplicación. –

Respuesta

0

Terminé usando el maven natives plugin y atendiendo al hecho de que tengo copias redundantes de las bibliotecas nativas del lugar. La razón de esto se debió principalmente a la simplicidad que ofrece el complemento y al hecho de que también tiene un plugin de eclipse relacionado que configura nativos en entornos de eclipse de desarrolladores sin intervención.

+0

Para el registro, he bifurcado el complemento mavennatives y lo he mejorado. Ofrece las mismas características además de algunas mejoras de velocidad al no descargar dependencias de los usuarios que no estén relacionadas con su plataforma y mucho más. Encuentra nativedependencies-maven-plugin aquí si estás interesado: https://github.com/fmarot/nativedependencies-maven –

0

Su fragmento muestra un objetivo asociado a una fase de construcción, no a una dependencia. ¿El objetivo de 'copiar dependencias' está en un súper pom y lo heredan todos los módulos? ¿No hay forma de moverlo solo a los módulos que se ejecutarán/empaquetarán como una aplicación?

0

Podría ser que no lo obtuve. Pero ¿por qué no implementa todas sus bibliotecas nativas en el repositorio al principio? Si las libs nativas son estables y cambian raramente, eso podría hacerse en un reactor separado.

Y luego usted hace referencia a esas dependencias nativas simplemente a través de GAV como cualquier otra dependencia. También el problema de una copia innecesaria se resuelve con eso.

Cuestiones relacionadas