2012-08-17 26 views
13

In Maven è molto facile da impostare le proprietà in un pom con la seguente sintassi:In Maven, come posso creare dinamicamente un valore di proprietà in fase di runtime?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

Ora ho bisogno di costruire una proprietà che dipende dalla versione del mio pom. Per creare la proprietà che voglio fare il seguente (pseudo codice Java):

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

Dovrebbe essere dinamica, perché è utilizzato come nome del tag nel nostro repository e deve essere sempre in sincronia con la versione del artefatto.

Qualche idea su come creare proprietà "dinamiche"?

risposta

25

Build-Helper Maven Plugin di Mojo può aiutare qui.

Esistono numerosi obiettivi che possono essere utilizzati per aiutare a trasformare le proprietà.

C'è

Probabilmente regex-property è quello che si desidera, ma se il v I numeri di ersione sono conformi agli "standard", gli altri due potrebbero salvarti.

Per utilizzare l'obiettivo regex-property si dovrebbe fare qualcosa di simile

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Nota: il mio regex potrebbe essere un po 'fuori così si dovrebbe verificare quanto sopra.

Nota: il valore della proprietà sarà disponibile per le esecuzioni solo dopo la fase a cui è associata questa esecuzione. La fase predefinita a cui è associata è validate ma se si è su un ciclo di vita diverso (ad esempio il ciclo di vita del sito) il valore non sarà disponibile.

+0

E se non lego il plug-in a una fase. Sto usando il plugin di rilascio di Maven e chiamo il rilascio dell'obiettivo: preparare. Come renderlo disponibile qui? – EhmKah

+0

se non si specifica una fase, per impostazione predefinita è associata alla fase 'validate', quindi lo snippet di codice sopra eseguirà l'obiettivo quando la fase di validazione è attiva. quando invochi direttamente un obiettivo, ad es. 'release: prepare', quello che succede è che maven esegue l'obiettivo saltando direttamente qualsiasi fase del ciclo di vita, quindi l'obiettivo' release: prepare' stesso non vedrà la proprietà * ma * il ciclo di vita * fork * di 'release: prepare' vedrà esso. Quindi 'release: prepare' non sarà in grado di utilizzare la proprietà per la codifica di SCM, ma la proprietà sarà presente nella build forked che il plugin di rilascio esegue –

+1

Se si desidera che il tag SCM sia basato sulla proprietà (è necessario aggiornare la tua domanda per riflettere sul fatto che questo è il tuo obiettivo, o iniziare una seconda domanda) allora potresti dover usare qualcosa come http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormat che non ti darà la sostituzione '_' che vuoi né l'iniezione' _P'. Raccomando di cambiare i requisiti del nome del tag piuttosto che provare a piegare Maven ;-) –

2

È possibile utilizzare il plugin maven build-helper, in particolare il suo regex-property mojo. Dai un'occhiata a usage examples (scorri fino a Imposta una proprietà applicando una regex sostitutiva alla sezione del valore).

Fondamentalmente si desidera qualcosa di simile nella vostra pom per ottenere myVersionTag proprietà dedotto da myValue:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

Avrei contrassegnato questa risposta come accettata perché è uguale a quella sopra. Grazie. – EhmKah

+1

Non proprio. L'esempio di Ihor inserisce un '\' tra '$' e '{' nell'elemento . Questo è il modo in cui il documento Codehaus dice di farlo ma è sbagliato. L'obiettivo della proprietà regex non funzionerà con il backslash e funziona senza di esso. E Codehaus è fuori dal mercato. –

+0

@SteveCohen Se i documenti sono errati, aprire un problema https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise

2

La risposta di Ihor Kaharlichenko è fondamentalmente corretta tranne che copia un errore dallo Codehaus documentation. Non dovrebbe esserci "\" tra "$" e "{". Il mojo funziona senza di esso e non funziona con esso. Veramente, con una comprensione di base di regex e Maven, non sono riuscito a vedere cosa avrebbe dovuto fare il backslash e in effetti è sbagliato.

La risposta di Stephen Connolly ha omesso correttamente il backslash. Stai attento.
Questo errore si è diffuso in tutto SO e con Codehaus il business probabilmente non verrà risolto.

Problemi correlati