2012-06-08 16 views
7

Ho un POM esperto che vorrei usare come modello, producendo artefatti con nomi diversi a seconda degli argomenti che gli ho passato. Ma non riesco a capire come specificare l'artefatto in runtime.posso specificare un maven project.artifactId in fase di runtime?

Se parametrizzare l'elemento <artifactId> in questo modo:

<artifact>foo-${bar}</artifact> 

Maven si lamenta:

[ATTENZIONE] 'artifactId' contiene un'espressione, ma dovrebbe essere una costante.

Se lascio fuori <artifactId> nel POM e tenta di specificare sulla riga di comando con

mvn -Dproject.artifactId=foo ... 

Maven si lamenta:

[ERRORE] 'artifactId' manca.

C'è un altro trucco che potrei usare per realizzare questo, oltre a ricorrere alla generazione del file POM al volo da un modello? [Hmm, forse potrei farlo usando il filtraggio delle risorse di Maven ...]

risposta

5

Se ho capito bene, vuoi riutilizzare un'applicazione di prova del modello e poter cambiare l'artefatto.

Questo caso d'uso può essere realizzato al meglio con Archetypes Maven. Vedi this to get you started. È abbastanza semplice e vale la pena imparare. Hai il tuo normale progetto Maven e aggiungi variabili come ${groupId} nel tuo progetto pom. Hanno poi vengono sostituiti con altri parametri da Lei forniti alla generazione archetipo:

mvn archetype:generate         \ 
-DarchetypeGroupId=<archetype-groupId>    \ 
-DarchetypeArtifactId=<archetype-artifactId>   \ 
-DarchetypeVersion=<archetype-version>    \ 
-DgroupId=<my.groupid>        \ 
-DartifactId=<my-artifactId> 

ci sono anche un sacco di archetipi creati da persone su GitHub dove si può imparare di più su strutturazione e filtraggio in Maven archetipi For example.

In alternativa è possibile provare a impostare il filtro Maven senza utilizzare il sistema di archetipo, ma non ho esperienza con questo. Non penso che tu possa eseguire un progetto senza che abbia un artefatto valido, alcune generazioni devono accadere prima (come nel generare da un archetipo) ma non sono sicuro.

+0

Grazie, sembra una buona misura. Sembra che ogni domanda di esperti abbia una risposta del modulo "c'è un plugin per questo" :-). Sospetto che la mia idea di usare il filtraggio di maven sarebbe diventata un archetipo di un povero uomo, quindi ha senso seguire qualcosa di provato invece di reinventare la ruota. –

+0

Sono d'accordo che gli archetipi sono la strada da percorrere, ma in realtà non risponde alla domanda. Anche se è una pratica totalmente negativa, è possibile impostare l'oggetto artefatto in fase di runtime? – dokaspar

0

Stai andando contro il principio di un maven che è che un pom presumibilmente rappresenta un progetto autonomo che genera un artefatto stabile (cioè evita build parametriche che non possono essere riprodotte facilmente).

Se è davvero quello che vuoi, userei maven-install-plugin come passo del ciclo di vita (e in particolare install-file) e parametrizzato piuttosto che provare a parametrizzare l'artefatto del pom stesso.

+0

Grazie per il feedback. La mia build è già in qualche modo parametrizzata (e il maven non sembra scoraggiarlo troppo, considerando il suo supporto integrato per ottenere proprietà dalla riga di comando, dall'ambiente, ecc.). Ma sono certamente un esordiente.Quello che devo fare è prendere un progetto "fabbrica" ​​e creare molte varianti che differiscono leggermente, producendo artefatti diversi. Daremo un'occhiata al file di installazione. –

Problemi correlati