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.
- Lo mejor es instalar cada dependencia nativa en el repositorio maven como una biblioteca independiente o un paquete archivado que contiene varias dependencias.
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?
¿Cómo resolviste eso a través de Ivy? ¿La forma en que describes eso? – khmarbaise
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
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. –