2009-11-12 8 views
24

Soy un poco más un maven newb, y estoy tratando de configurar un proyecto maven que construya varios proyectos secundarios, pero todavía permite que alguien tome uno de ellos el niño lo proyecta y lo construye independientemente sin el padre.Maven: crear proyectos secundarios que pueden ser independientes de su padre

parentfolder 
    ->pom.xml 
    ->project1 
    ->pom.xml 
    ->src 
    ->project2 
    ->pom.xml 
    ->src 
    ->project3 
    ->pom.xml 
    ->src 

Básicamente quiero a alguien que sea capaz de pago y envío ParentFolder y hacer mvn compile para construir todos los proyectos, y también para que alguien sea capaz de pago y envío solo proyecto 1 y no mvn compile para construir eso se trata.

He intentado declarar los sub-proyectos como módulos en el pom.xml de nivel superior,

<modules> 
    <module>project1</module> 
    <module>project2</module> 
    <module>project3</module> 
</modules> 

Pero eso parece exigir que la información pom.xml matriz se declara en los niños. Esto hace que los proyectos dependientes del padre pom.xml estén presentes, que es lo que quería evitar.

Respuesta

0

El padre principal y su versión no se deben declarar en los hijos.

Si sus proyectos tienen un padre declarado, debe estar disponible en la compilación de modo que uno de los módulos debe ser el pom principal, o en un repositorio. Pareces estar diciendo que quieres que alguien revise un proyecto que depende de uno de los padres, pero no tiene acceso a los padres y aún puede construir el proyecto, que es como tratar de construir un proyecto sin sus dependencias.

Usted estés opciones para hacer la matriz pom disponibles son:

  • prepara un repositorio Maven pública, desplegar el pom de los padres a la misma, y ​​poner la información del repositorio en los poms del niño.
  • Puede decirle a maven que busque el padre padre en una ruta relativa antes de que revise los repositorios (esto es para ayudarlo cuando tenga cambios locales en el pom padre, aún no implementado). Por lo tanto, podría realizar un svn: external o su equivalente en su proyecto hijo a su padre principal.
45

Debe tener en cuenta las diferencias entre la relación padre-hijo y el concepto de agregación en Maven2. No son el mismo principio, incluso si a menudo se usan al mismo tiempo.

PADRES

El primer concepto es que un proyecto declara en su pom.xml un padre:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>foo</groupId> 
     <artifactId>bar</artifactId> 
     <version>42</version> 
    </parent> 
    ... 

En este caso, con el fin de construir este componente, el proyecto principal debe encontrarse en el repositorio local. Este es tu caso aquí.

El interés del concepto principal en Maven 2 es heredar propiedades, dependencias, configuración. Este es el lugar donde pondrás toda la información común de los proyectos para niños.

Este es exactamente el mismo concepto de extends en lenguaje Java.

agregación

En este caso, usted tiene un proyecto que agrega varios submódulos especificando sus nombres en module nodos:

<modules> 
    <module>commons</module> 
    <module>client</module> 
    <module>server</module> 
    ... 
</modules> 

Esto significa que cada comando que va a ejecutarse en este el proyecto raíz se ejecutará en cada módulo (el orden está definido por Maven 2 Reactor). Por ejemplo, si ejecuta mvn clean install en el proyecto raíz, Maven 2 ejecutará este comando en el proyecto raíz, luego en el proyecto commons, luego en client y finalmente en server.

En este concepto, puede compilar un proyecto sin compilar ningún otro proyecto (excepto si hay interdependencias, por supuesto).

Aquí es un esquema que muestra los dos conceptos diferentes:

alt text http://books.sonatype.com/mvnref-book/reference/figs/web/pom_real_multi.png

usted tiene una explicación más detallada sobre estos dos conceptos en el Maven: La guía definitiva, here.

+4

muy bien detallada respuesta, gracias –

1

Los subproyectos solo dependen del padre si usan <matriz> etiqueta (herencia maven). No es necesario que use la etiqueta principal < > en los submódulos. Sin embargo, si quiere que sus módulos hereden elementos comunes del pom padre, entonces tiene que usar herencia heven.

Estrictamente hablando, si es usando herencia y desea construir solo un subproyecto, entonces el padre pom.xml no tiene que estar presente en el directorio principal; siempre que maven pueda encontrar el padre padre en un repositorio local o remoto, entonces se construirá. En la práctica, si hay cambios en su pom padre, tendrá que encontrar la forma de lograr que los miembros de su equipo se mantengan actualizados con el pom padre.

+0

lo que dices es, si solo quieres construir el submódulo pero no heredas ninguna definición de pom padre, no tienes que usar la etiqueta en el pom hijo? –

+1

quién sabe, eso fue hace 7 años cuando respondí esta pregunta;) –

0

Me parece que el problema es que Maven está sobrecargando la etiqueta padre. Maven sigue diciéndome que la herencia y la agregación son dos cosas diferentes, pero ambas usan la misma etiqueta para lograr su función. Esto hace militar contra el escenario que el cartel original está pidiendo. Uno puede querer

  1. heredan ciertas configuraciones de un antepasado común, sin embargo,
  2. tienen dos compilaciones de aplicaciones diferentes que comparten un componente común.

Por lo tanto, aquí tenemos dos interpretaciones diferentes de la relación principal. Primero, el "padre" que contribuye con la configuración de cada módulo y el segundo, el "padre" cuya construcción construye el hijo. Como hay dos de estos últimos, esto se rompe. Las dos ideas de parentesco se interponen en el camino del otro.

Cuestiones relacionadas