2011-01-11 21 views
8

Actualmente estoy luchando con Maven: tengo un proyecto complejo hecho de varios módulos anidados y para algunos de esos módulos, tengo configuraciones similares en los POM.Cómo compartir fragmentos POM entre diferentes POM

Me gustaría hacerlo limpio. En realidad, me gustaría definir una configuración común de "jar ejecutable" y activarla en algunos módulos.

Aquí es el fragmento POM me gustaría compartir entre varios proyectos:

<build> 
    <plugins> 
     <plugin> 

     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 

      <!-- Use a custom descriptor, with suffix "bin" --> 
      <descriptors> 
       <descriptor>src/main/assembly/runnable-jar-assembly.xml</descriptor> 
      </descriptors> 

      <!-- Add main class to manifest --> 
      <archive> 
       <manifest> 
        <mainClass>${mainClass}</mainClass> 
       </manifest> 
      </archive> 

     </configuration> 

     <!-- Add build of this package to lifecycle --> 
     <executions> 
      <execution> 
       <id>make-runnable-jar</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 

     </plugin> 
    </plugins> 
</build> 

En algunos de los POMS, me gustaría ser capaz de hacer algo como:

<!-- Set the main class --> 
<properties> 
    <mainClass>my.main.Class</mainClass> 
</properties> 

<!-- Activate runnable jar build --> 
<import>src/main/pom/runnable-jar-pom.xml</import> 

I he buscado un medio para importar algunos fragmentos XML en un POM, o para definir una macro entera de conjunto de nodos XML.

Por lo que he encontrado, la solución más cercana sería definir un perfil en el POM padre y activarlo en algunos módulos secundarios probando la presencia de un archivo. See this related question. Pero me enfrento al problema de que la propiedad {basedir} no está configurada correctamente heredada/establecida.

Me resulta muy sorprendente necesitar un truco para hacer algo tan básico (= habitual). ¿Cómo manejas esto en Maven?

Respuesta

6

Acabo de descubrir algo que podría solucionar mi problema:

Un módulo no requiere ser una submódulo de su módulo principal.

Padres y submódulo relaciones son conceptos distintos.

Puede especificar un módulo POM madre que no es la carpeta principal real en su estructura de carpetas, mediante el uso de la relativePath atributo (as explained in the doc)

En mi caso, utilizo la siguiente distribución:

  • principal proyecto
    • utils (padre: principal proyecto)
    • CLI-programas (padre: principal proyecto)
      • genérico-cli (padres: cli-programas; Maniquí & módulo POM vacío)
      • CLI-1 (padre: genérico-CLI)
      • CLI-2 (padre: genérico-cli)

Luego, en generic-cli/pom.xml puedo declarar una configuración que es c ommon a todos mis programas cli (como suites de prueba personalizadas, paquetes de jar ejecutables, etc.).

0

no es una respuesta total, pero una solución al problema basado es utilizar un diseño común de los módulos, p. root/modules/moduleA root/modules/moduleB.

Ya no puede construir los módulos desde su propio directorio, solo a través de un proyecto principal. Pero puedes trabajar con los perfiles.

5

Una forma de hacer esto sería declarar su código <plugin> dentro de <pluginManagement> del pom padre de su proyecto de varios módulos. Los módulos individuales pueden tener una sección <plugin> que puede usar esto sin volver a definir los contenidos.

pom Padres:

<pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
       ... all the details... 
     </plugin> 
     ... 
    </plugins> 
</pluginManagement> 

poms del Niño:

 <plugins> 
     ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
     </plugin> 
    </plugin> 
+0

Agradable. No estaba al tanto de esa posibilidad. –

Cuestiones relacionadas