Ein Maven Archetype ist ein Template für Projekte. Über die Kommandozeile lassen sich so fertig, vorkonfigurierte Sourcen generieren, mit denen direkt losgelegt werden kann. Gerade in größeren Unternehmen wo häufig neue Projekte aufgesetzt werden sollen, die einer einheitlichen Struktur entsprechen, kann eine solche Archetype sehr hilfreich sein. Schauen wir uns an, wie ein Vorgehen dafür aussehen könnte.
Um einen eigenen Archetype zu erzeugen nutzen wird (*Trommelwirbel*) natürlich einen Maven Archetype, der uns die Basis-Konfiguration anlegt
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-archetype \
-DarchetypeVersion=1.4
Werfen wir ein Blick auf die Bestandteile (hier bereits um einige Elemente ergänzt)

1. Template
Hier werden alle Dateien abgelegt, die später Teil des generierten Projektes werden sollen. Dabei haben wir natürlich die Möglichkeit Variablen zu verwenden, die später beim Aufruf übergeben werden können
quarkus.datasource.db-kind=${jdbcKind}
quarkus.datasource.jdbc.url=${jdbcUrl}
quarkus.datasource.username=${jdbcUser}
quarkus.datasource.password=${jdbcPassword}
package ${package}.repository;
import ${package}.repository.model.MessageEntity;
@ApplicationScoped
public class MessageRepository implements PanacheRepository<MessageEntity> {...}
Neben den Variablen innerhalb der Dateien können auch Ordner-Bezeichnungen als Template definiert werden. Dazu wird der Ordner wie die Variable benannt, umschlossen von einem doppelten Unterstrich:
src/main/resources/archetype-resources/src/main/resources/__dbMigrationFolder__
2. Konfiguration
In dieser Datei werden zum einen die zusätzlichen Parameter definiert, die der Archetypen bei der Generierung abfragt und zum anderen die Verarbeitung der Template-Dateien konfiguriert
<archetype-descriptor>
<requiredProperties>
<!-- mit default -->
<requiredProperty key="dbMigrationFolder">
<defaultValue>db</defaultValue>
</requiredProperty>
...
<!-- ohne default -->
<requiredProperty key="jdbcUser"/>
</requiredProperties>
<fileSets>
<!--
filtered = Verarbeitung der Variablen
packaged = Ordner in diesem Pfad werden automatisch im definierten
Package abgelegt (Variable: package, z.B. de.gedoplan)
-->
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
</fileSet>
<fileSet filtered="true">
<directory>src/main/resources</directory>
</fileSet>
</fileSets>
</archetype-descriptor>
3. Skripting
Ein optionales Groovy Script, das nach der Erstellung des Projektes läuft, um alles das zu tun, was mittels Variablen nicht möglich ist (hier ein Beispiel: Ergänzung einfacher Testdaten in Flyway-SQL-Skript)
4. IT Test
Unter test/resources/projects ist jeder Unterordner ein Integrationstest, der beim Bauen des Archtypes automatisch aufgerufen wird. Die Datei archetype.properties wird mit den entsprechenden Parametern zur Generierung des Projektes versehen
groupId=de.gedoplan
artifactId=basic-project
version=0.1-SNAPSHOT
package=de.gedoplan
jdbcUser=sa
jdbcPassword=sa
messages=Hello World,Lorem Ipsum
Mit diesen Parametern wird ein Projekt auf Basis des Archtypes generiert und anschließend mit den Dateien unterhalb des Ordners reference verglichen. Der Test ist nur erfolgreich, wenn die generierten mit den Referenz-Dateien (Struktur/Bezeichnungen/Inhalt) übereinstimmen.
5. pom.xml
pom.xml für den Archetype selber.
Fazit
Nachdem der Archtypy erfolgeich mittels mvn install bereitgestellt wurde, sollte dieser nun im Katalog der Archetypen zur Verfügung stehen und bei Auswahl die erforderlichen Parameter abfragen
> mvn archetype:generate
....
3630: local -> de.gedoplan:ArchetypeDemo (Archetype - ArchetypeDemo)







