2011-01-11 23 views
8

Attualmente sono alle prese con Maven: Ho un progetto complesso costituito da diversi moduli nidificati e per alcuni di questi moduli, ho configurazioni simili nelle POM.Come condividere i frammenti POM tra diverse POM

Mi piacerebbe renderlo pulito. In realtà, vorrei definire una configurazione comune "runnable-jar" e attivarla in alcuni moduli.

Ecco il frammento POM vorrei condividere tra diversi progetti:

<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> 

in alcuni dei POMS, vorrei essere in grado di fare qualcosa di simile:

<!-- 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 hanno cercato un mezzo per importare alcuni frammenti XML in un POM o per definire un'intera macro di nodeset XML.

Per quello che ho trovato, la soluzione più vicina sarebbe quella di definire un profilo nel POM padre e attivarlo in alcuni sottomoduli testando la presenza di un file. See this related question. Ma sto affrontando il problema della proprietà {basedir} non impostata correttamente ereditata/impostata.

Trovo molto sorprendente avere bisogno di un trucco per fare qualcosa di così semplice (= solito). Come lo maneggi di solito in Maven?

risposta

6

ho appena scoperto qualcosa che potrebbe risolvere il mio problema:

Un modulo non richiede di essere un sottomodulo del suo modulo genitore.

Parent e sottomodulo rapporti sono concetti distinti.

È possibile specificare un modulo genitore POM che non è la cartella attuale genitore nella struttura delle cartelle, utilizzando il relativePath attributo (as explained in the doc)

Nel mio caso, io uso il seguente schema:

  • principale progetto
    • utils (genitore: main-project)
    • cli-programmi (genitore: main-project)
      • generic-cli (genitore: CLI-programmi; Dummy & modulo POM vuoto)
      • cli-1 (genitore: nucleo-CLI)
      • cli-2 (genitore: generic-cli)

Quindi, in generic-cli/pom.xml Posso dichiarare una configurazione che è c a tutti i miei programmi cli (come suite di test personalizzate, imballaggi run-jar, ecc.).

0

non una risposta totale ma una soluzione al problema baseir è utilizzare un layout comune dei moduli, ad es. root/modules/moduleA root/modules/moduleB.

Non è possibile creare i moduli formm la propria directory più, solo tramite il progetto genitore principale. Ma puoi lavorare con i profili.

5

Un modo per farlo sarebbe quello di dichiarare il codice <plugin> all'interno di <pluginManagement> del parametro padre del progetto multi-modulo. I singoli moduli possono quindi avere una sezione <plugin> che può utilizzare ciò senza ridirigere il contenuto.

Parent pom:

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

pon Bambino:

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

Bello. Non ero a conoscenza di questa possibilità. –

Problemi correlati