2011-06-14 11 views
5

Hay algunas preguntas similares, pero nada como esto. Cómo lidiar con esta situación (escenario típico):Composición del proyecto de varios módulos de Maven con respecto a las dependencias que comparten

Un proyecto de 8-11 proyectos infantiles, que tiene un artefacto/proyecto principal y un proyecto principal que usa/declara a los otros como módulos.

El problema es que todos los proyectos "estrictamente" solo comparten las dependencias comunes, como testng, logging, apache commons and stuff. Pero siempre como 3 de ellos usan 50-60% de los mismos deps específicos (apache-química, jackrabbit, abdera, etc.), otros 2-3 de ellos también usan 50-60% de las mismas pero diferentes dependencias. Y el principal usa muchos de los mismos deps.

No puedo poner esos fragmentos compartidos "no estrictamente" en el proyecto principal para que otros los hereden. Entonces solo los deps comunes son heredados. Y hay toneladas de dependencias duplicadas. Y solo puedo administrar sus versiones a través del <dependencyManagement>.

Otra opción es tener parent pom que contenga la mayoría de las dependencias, pero los proyectos secundarios heredan incluso aquellos que no necesitan.

Podría tener más de 1 proyecto principal, pero no me parece correcto. También la herencia del proyecto principal podría ser una pesadilla, porque no se sabe qué dependencias necesita el proyecto, si no se documenta/comenta correctamente la definición principal de pom.

Otra forma es crear artefactos pom que sirvan solo como contenedores de dependencia: declaran grupos específicos de dependencias, de modo que los módulos simplemente declaran que esos obtienen dependencias transitivas. Pero bueno, le gustaría implementar y cometer algún tipo de

OneDepArtifact declarar jackrabit, abdera, chemistry

AnotherDepArtifact declarar htmlcleaner, google-api, tika

ThirdDepArtifact declarar spring, httpclient, selenium

Es un gran lío, no estoy seguro de si use <dependencyManagement> correctamente, parece ser solo útil para administrar versiones de dependencia.

Estaba pensando en adaptar el desarrollo de mi aplicación al "diseño de multimodulos maven". Pero si desea crear servicios/beans de primavera, simplemente use varias bibliotecas, en un módulo, no las implemente en un módulo diferente, simplemente porque usan una biblioteca que también usa otro módulo :-)

+0

Tengo exactamente el mismo problema. Me gusta gestionar proyectos multimodulares debido a las otras ventajas que ofrece, pero este intercambio cruzado de dependencias es una pesadilla, si el proyecto se agranda. – lisak

+0

Tal vez tengamos que adaptar el desarrollo de la aplicación real al diseño del proyecto multimodular y tratar de crear tales componentes para que no exista ninguna reutilización de dependencias ... Pero eso no parece correcto – lisak

Respuesta

0

Si es principalmente sobre el control de versiones (número) - por qué no especificar sólo la versión de la dependencia como propiedad en el proyecto principal y utilizarlo en los proyectos secundarios, como

padres

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-parent</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <properties> 
     <log4j.version>1.2.16</log4j.version> 
    </properties> 

</project> 

niño

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <artifactId>maven-parent</artifactId> 
     <groupId>foo.bar</groupId> 
     <version>0.0.1</version> 
    </parent> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-child</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
    </dependencies> 

</project> 

Esta es una solución simple que le permite especificar dependencias de proyecto específicas con números de versión consistentes.

+0

No se trata de la versión control en absoluto, esto es solo lo que es bueno para ... No tengo problemas con el infierno de la versión, a diferencia de otros ... Lo mencioné en la pregunta, que esto es lo único que tengo bajo control ... Combino propiedades con dependencyManagement, basado en lo que se hereda y lo que no es – lisak

+0

El problema es la cantidad y la duplicación de dependencias en todos esos poms, incluso si tiene versiones bajo control, es simplemente muy difícil de mantener en un gran proyecto – lisak

1

Sé que dijiste que podría ser una pesadilla, pero creo firmemente que la herencia entre tus padres es el camino a seguir.

Describo una buena estructura de proyecto multi-módulo en this answer. También describe el uso de un agregador y la herencia de cadenas de padres.

Algunas cosas que le ayudarán a mantener las cosas organizadas y sano ...

  • Use las convenciones de nomenclatura buena; no solo llame a los proyectos principales parent1 y parent2. Use nombres que describan qué tipo de dependencias y otras cosas configuran, de modo que sea intuitivo que las personas sepan qué usar cuando.
  • Utilice la función de lanzamiento/implementación de maven para que estas estén versionadas en su repositorio correctamente y siempre hagan referencia a artefactos de versión fija. No usar SNAPSHOTs es el primer paso para tener construcciones deterministas y reproducibles. Problemas de depuración cuando las cosas cambian sobre la marcha es muy difícil.
  • No confíe en un archivo pom.xml para saber qué dependencias necesita su proyecto. Esto lo llevará a evitar la herencia y otras cosas como perfiles personalizados. Debe usar maven-dependency-plugin para realizar estas tareas de análisis. Hay comandos como mvn dependency:tree que muestran todas las dependencias de un proyecto y mvn dependency:analyze que muestran las dependencias no utilizadas.

Afortunadamente, con este consejo, la herencia del archivo POM principal no parecerá tan complicada y pesadillesca. ¡Buena suerte!

+0

Solo tengo un padre dir/pom (hereda de SuperPom y agrega los 10 módulos) y module dirs/pom en el mismo nivel. Los módulos heredan de parent y son sus módulos. Sin embargo, ya hago todo lo que sugieres. Creo que solo tengo que aceptarlo tal como es. No quiero encadenar herencia con 3 subpares ... Prefiero que todos los módulos declaren todas esas dependencias duplicadas en el proyecto de varios módulos – lisak

+0

@lisak - ¿Por qué preferiría volver a declarar todas las dependencias duplicadas en lugar de usando herencia? Además, debe intentar hacer que su pom padre sea DIFERENTE del agregador pom. En mi experiencia, esto siempre hace las cosas más fáciles. Describo este diseño en la respuesta a la que me he vinculado. –

+0

Si compartir dependencias es el único aspecto que hace que los módulos sean hermanos, el encadenamiento de la herencia es imho redundante. Si también hay algunos complementos o elementos de la fase de compilación para heredar, ¿por qué no? Pero de lo contrario, me resulta más fácil trabajar con él. También es difícil rastrear las dependencias de tiempo de ejecución/prueba declaradas no utilizadas que se enumeran en la dependencia: analizar ...simplemente no me importa si lo uso o no, tal vez ese sea el problema principal, la existencia de esta característica no me brinda ningún alivio en este caso :-) – lisak

Cuestiones relacionadas