Sono interessato a creare un archetipo di Maven e penso di avere la maggior parte delle nozioni di base. Tuttavia, una cosa su cui sono bloccato è che a volte voglio usare la logica personalizzata per riempire un modello. Ad esempio, se qualcuno genera il mio archetipo e specifica l'artefatto come hello-world, mi piacerebbe generare una classe denominata HelloWorld che stampi semplicemente "Hello World!" alla console. Se un'altra persona la genera con artefatto, vuol dire che là, la classe scelta sarebbe HowdyThere e stamperebbe "Howdy There!".Come posso fornire una logica personalizzata in un archetipo Maven?
So che sotto le copertine, il meccanismo dell'archetipo di Maven sfrutta il Velocity Template Engine, quindi ho letto questo articolo su creating custom directives. Questo sembrava essere quello che stavo cercando, così ho creato una classe chiamata HyphenatedToCamelCaseDirective che estende org.apache.velocity.runtime.directive.Directive. In questa classe, la mia implementazione getName() restituisce "hyphenatedCamelCase". Nel mio file archetipo-metadata.xml, ho il seguente ...
<requiredProperties>
<requiredProperty key="userdirective">
<defaultValue>com.jlarge.HyphenatedToCamelCaseDirective</defaultValue>
</requiredProperty>
</requiredProperties>
mia classe template si presenta così ...
package ${package};
public class #hyphenatedToCamelCase('$artifactId') {
// userdirective = $userdirective
public static void main(String[] args) {
System.out.println("#hyphenatedToCamelCase('$artifactId')"));
}
}
Dopo aver installato il mio archetipo e poi fare un archetipo: generare specificando artifactId = Salve-là e groupId = f1.f2, la classe risultante si presenta così ...
package f1.f2;
public class #hyphenatedToCamelCase('howdy-there') {
// userdirective = com.jlarge.HyphenatedToCamelCaseDirective
public static void main(String[] args) {
System.out.println("#hyphenatedToCamelCase('howdy-there')"));
}
}
il risultato mostra che, anche se si sta userdirective impostato il modo in cui mi aspettavo che, non èevagliando le direttive #hyphenatedToCamelCase come speravo. Nella classe direttiva, ho il metodo render che registra un messaggio su System.out, ma quel messaggio non appare nella console, così da indurmi a credere che il metodo non sia mai stato eseguito durante l'archetipo: generate.
Mi manca qualcosa di semplice qui, o questo approccio non è la strada da percorrere?