2011-09-29 7 views
5

Ho una domanda riguardante le proprietà in un progetto a più moduli.Le proprietà Maven nel progetto multi-modulo vengono ripristinate sui valori predefiniti

Si consideri il seguente 3 a livello di progetto struture:

project 
+- pom.xml (packaging: pom)  //referred to as super-pom 
+- module_group 
    +- pom.xml (packaging: pom)  //referred to as group-pom 
    +- module 
     +-pom.xml (packaging: jar) //referred to as module-pom 

Nel super-pom definisco una proprietà revisione che ottiene il valore di default "sconosciuto".

Inoltre dichiaro e utilizzare il buildnumber-maven-plugin che è configurato per ottenere la revisione svn e metterlo in proprietà revisione.

Quindi configurare lo maven-jar-plugin per scrivere quella proprietà nel manifest.

Nel modulo-pom dichiaro l'utilizzo di buildnumber-maven-plugin in modo che venga effettivamente eseguito.


Questo tutto funziona quando si crea il modulo direttamente, cioè eseguendo solo il modulo-pom. Il file manifest contiene la revisione riportata dallo buildnumber-maven-plugin come viene stampato nella console.

Tuttavia, se eseguo il super-pom o gruppo-pom il valore predefinito per revisione viene scritto il manifesto, anche se il buildnumber-maven-plugin Viene eseguito e recupera la revisione corretta (la stampa alla console prima le esecuzioni maven-jar-plugin).

Quindi ho la sensazione che mi manca qualcosa sull'ereditarietà delle proprietà nei progetti multi-modulo.

Qualcuno ha un'idea di cosa potrebbe essere sbagliato qui? O qualcuno potrebbe indicarmi una descrizione di come vengono effettivamente gestite le proprietà in questi casi (sfortunatamente non sono riuscito a trovare una buona descrizione)?

Aggiornamento

ho fatto qualche ricerca e un paio di test viene eseguito con l'output di debug (-X opzione) e da quello che ho trovato finora, presumo il mio problema è il seguente:

1) Durante pom parsing le proprietà utilizzate nel pom sono sostituiti con i loro valori.

Considerate questo pom parziale:

<!-- declare the property default value --> 
<properties> 
    <revision>default</revision> 
</properties> 

... 

<!-- use the property --> 
<someconfig>${revision}</someconfig> 

Dopo pom viene valutata, sembra risultare in uno stato che corrisponderebbe a questo:

<properties> 
    <revision>default</revision> 
</properties> 

... 

<!-- The property seems to be "statically" replaced --> 
<someconfig>default</someconfig> 

2) Il plugin che imposta l'attuale il valore della proprietà viene eseguito in seguito, anche se durante la fase validate.

Quindi la proprietà stessa è correttamente impostata sul nuovo valore, ma non viene più letta.

3) Il plugin che utilizza <someconfig> (nel mio caso sarebbe il maven-jar-plugin) ora gira con <someconfig>default</someconfig> e quindi non legge revision affatto.

Qualcuno può confermarlo?

risposta

0

Posso solo dire che dichiarare buildnumber-maven-plugin e maven-jar-plugin in un super-pom funziona bene per me, non importa se si tratta di una build di gruppo o di una build mirata.

Ecco una parte di questa super-pom (un genitore per tutti i progetti):

 <!-- Generate build number --> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>buildnumber-maven-plugin</artifactId> 
      <version>1.0</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>create</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <doCheck>false</doCheck> 
       <doUpdate>false</doUpdate> 
      </configuration> 
     </plugin> 
     <!-- Attach build number to all jars --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.1</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
        </manifest> 
        <manifestEntries> 
         <Implementation-Build>${buildNumber}</Implementation-Build> 
         <Implementation-Build-Timestamp>${maven.build.timestamp}</Implementation-Build-Timestamp> 
        </manifestEntries> 
       </archive> 
      </configuration> 
     </plugin>