2011-08-28 27 views
17

Sto creando un archetipo Maven che genera uno scheletro di progetto che includerà una dipendenza dal progetto da cui è originato l'archetipo .Come incorporare la versione del progetto dell'archetipo nell'archetipo Maven?

Ad esempio, il progetto di origine assomiglia:

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

e l'archetipo genererà un progetto con un POM che contiene dipendenze in questo modo:

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

voglio SOMEVERSION di essere il versione del progetto di origine al momento che l'archetipo sia compilato e installato nel repository.

Quindi, se il progetto di origine è alla versione 1.0-SNAPSHOT ed è mvn install ed, allora voglio l'archetipo di generare una dipendenza origin-core 1.0-SNAPSHOT. E quando il progetto di origine viene rilasciato, e automaticamente eseguito il bump alla versione 1.0, voglio che l'archetipo generi una dipendenza su origin-core 1.0.

Fondamentalmente mi piacerebbe usare come variabile Velocity nell'archetipo POM, ma ciò non sembra possibile.

C'è qualche altro modo per realizzare ciò che sto cercando di fare qui?

risposta

32

Ho fatto la domanda di cui sopra sulla mailing list Maven alcuni giorni fa e ho avuto dei tumbleweeds. Fortunatamente, alla fine ho capito da solo. Ecco almeno un modo corretto per eseguire questa operazione:

Utilizzare il filtro Maven sul file src/main/resources/archetype-resources/pom.xml per sostituire la versione corrente del progetto durante la creazione dell'archetipo.

Ecco come questo è fatto:

modificare il file archetype/pom.xml per attivare il filtro sul file archetype-resources/pom.xml e non su qualsiasi altra cosa (perché i file archetipo avranno naturalmente ${variable} s in tutto il luogo e non si desidera che tali per essere sostituito al momento della compilazione, si desidera che vengano sostituiti quando viene creato l'archetipo).

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

Abilitare un carattere di escape per l'utilizzo durante il filtraggio, in modo che si può sfuggire tutte le variabili nel pom archetipo che hanno bisogno di rimanere così com'è in modo che possano essere sostituiti al momento della generazione archetipo:

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 

(Nota le <resources> e <pluginManagement> elementi mostrati sopra dovrebbe essere collocato all'interno dell'elemento <build> del POM.)

Uso ${project.version} nel vostro pom archetipo, in cui si desidera inserire la versione del progetto archetipo, e la fuga di tutte le altre variabili che dovrebbero rimanere non sostituito fino al momento archetipo generazione:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

Esattamente quello di cui avevo bisogno. Molte grazie. –

+0

Funziona come un fascino! Grazie. – Malvin

+0

Questo è così dolce, post eccellente. – ocarlsen

12

Un'alternativa soluzione alla risposta accettato è quello di filtrare una proprietà predefinita nel file archetype's descriptor/metadata

questo è fatto in questo modo:

l'esperto di filtraggio solo filtri di questo file:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

L'archetipo meta file di dati:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

e POM del archetipo sarebbe simile a prima, tranne che avrebbe utilizzato il valore della proprietà necessaria projectVersion come la versione del progetto:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 

Questo approccio ha il vantaggio di evitare di dover sfuggire a tutti i valori delle proprietà nel POM dell'archetipo e alla configurazione del plugin della risorsa che lo accompagna . Personalmente, trovo tutto abbastanza brutto e soggetto a errori.

Significa che all'utente viene chiesto di confermare o modificare la versione del progetto durante la generazione dell'archetipo. A seconda dello scenario, immagino che questo possa essere considerato una cosa buona o cattiva.

+0

Questa soluzione è decisamente migliore di quella accettata. Grazie mille per questo. Risparmia molto tempo –

-1

Ho provato qualcosa di piuttosto stupido e sembra aver funzionato. Ho aggiunto il seguente al mio file META-INF/maven/archetipo-metadata.xml:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

Si potrebbe pensare che sarebbe sapere di default, ma non lo fa in modo tale che sembra di ricordare che per usarlo . Forse è a causa di un bug in Maven.

+0

Non funziona se si utilizza la modalità interattiva e si devono filtrare le risorse di prova dell'archetipo. Opzionalmente puoi contare su @PhilMander answer per fare il lavoro. – LoganMzz

Problemi correlati