In questo caso specifico, l'archetipo potrebbe sempre creare tutti i moduli necessari e spostare le diverse sapori (insieme di moduli) in profili. Solo un profilo sarà attivo per impostazione predefinita come specificato durante il passaggio archetype:generate
.
Come tale, se voglio avere la serie di moduli per flavorA, correrò l'archetipo come
mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true
E l'archetipo passerà questa variabile all'elemento activeByDefault
del profilo flavorA re -definizione dell'elemento modules
per il set di moduli richiesto dagli utenti flavorA.
Lo stesso potrebbe essere fatto per flavorB e flavorB (per esempio), ciascuna delle quali definisce un diverso insieme di moduli.
Un esempio di tale POM aggregatore/genitore come parte del l'archetipo sarebbe:
<profiles>
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>${flavourA}</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourB</id>
<activation>
<activeByDefault>${flavourB}</activeByDefault>
</activation>
<modules>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourC</id>
<activation>
<activeByDefault>${flavourC}</activeByDefault>
</activation>
<modules>
<module>profiles-module1</module>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
</profiles>
Il file archetype-metadata.xml
potrebbe quindi specificare:
<requiredProperties>
<requiredProperty key="flavourA">
<defaultValue>false</defaultValue>
</requiredProperty>
<requiredProperty key="flavourB">
<defaultValue>false</defaultValue>
</requiredProperty>
<requiredProperty key="flavourC">
<defaultValue>false</defaultValue>
</requiredProperty>
</requiredProperties>
E l'archetipo invocato con l'-DflavorB=true
l'opzione sarebbe quindi generare un pom come segue:
<profiles>
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourB</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourC</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<modules>
<module>profiles-module1</module>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
</profiles>
Tale approccio ha i seguenti vantaggi e svantaggi:
Vantaggi
- ti tengono i moduli comuni e la manutenzione archetipo in un unico luogo centralizzato, lasciando la scelta di sapori per l'utente del archetipo
- utenti del archetipo potrebbe, se desiderato e con costo zero, passare da un sapore all'altro solo attivazione/disattivazione profili
- l'approccio utilizza lo standard Maven offre
Svantaggi
- Ogni archetipo genererà l'intero insieme di moduli, anche se non tutti sarà richiesto
- Se veramente un "rumore", l'utente potrebbe eliminare manualmente la moduli indesiderati, ma sarebbe un'azione manuale
Inoltre, sulla parte superiore del t si avvicina sopra, potremmo anche configurare il Maven Clean Plugin in ciascun profilo per eliminare i moduli non interessati dal suo sapore, in modo che alla sua prima build (a maven clean
), qualsiasi modulo non richiesto venga eliminato. Tale approccio lascerebbe comunque il POM con profili incoerenti, ma potrebbe anche essere considerato (non consigliato).
Qualcosa di simile:
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>${flavorA}</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/profiled-module1</directory>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
</profile>
Correlato a questo numero: https://issues.apache.org/jira/browse/ARCHETYPE-274 –
Vedere anche https://issues.apache.org/jira/browse/ARCHETYPE-494. – manouti