Я заинтересован в создании архетипа Maven, и я думаю, что у меня большая часть основ. Однако одна вещь, за которую я застрял, - это то, что иногда я хочу использовать пользовательскую логику для заполнения шаблона. Например, если кто-то генерирует мой архетип и указывает artifactId как hello-world, я бы хотел сгенерировать класс HelloWorld, который просто выводит "Hello World!". на консоль. Если другой человек генерирует его с помощью artifactId = howdy-there, класс genned будет HowdyThere, и он распечатает "Howdy There!".
Я знаю, что под обложками механизм архетипа Maven использует механизм шаблонов Velocity, поэтому я прочитал эту статью о создании пользовательских директив. Кажется, это то, что я искал, поэтому я создал класс под названием HyphenatedToCamelCaseDirective, который расширяет org.apache.velocity.runtime.directive.Directive. В этом классе моя реализация getName() возвращает "hyphenatedCamelCase". В моем файле archetype-metadata.xml у меня есть следующее...
<requiredProperties>
<requiredProperty key="userdirective">
<defaultValue>com.jlarge.HyphenatedToCamelCaseDirective</defaultValue>
</requiredProperty>
</requiredProperties>
Мой класс шаблонов выглядит следующим образом:
package ${package};
public class #hyphenatedToCamelCase('$artifactId') {
// userdirective = $userdirective
public static void main(String[] args) {
System.out.println("#hyphenatedToCamelCase('$artifactId')"));
}
}
После того, как я установил свой архетип, а затем сделаю архетип: сгенерируем, указав artifactId = howdy-there и groupId = f1.f2, получившийся класс выглядит следующим образом:
package f1.f2;
public class #hyphenatedToCamelCase('howdy-there') {
// userdirective = com.jlarge.HyphenatedToCamelCaseDirective
public static void main(String[] args) {
System.out.println("#hyphenatedToCamelCase('howdy-there')"));
}
}
Результат показывает, что даже несмотря на то, что userdirective устанавливается так, как я ожидал, он не оправдывает директивы #hyphenatedToCamelCase, как я надеялся. В классе директивы у меня есть метод рендеринга сообщения в System.out, но это сообщение не отображается в консоли, поэтому я полагаю, что метод никогда не выполнялся во время архетипа: сгенерируйте.
Я пропустил что-то простое здесь, или этот подход просто не подходит?