我对创建 Maven 原型很感兴趣,并且我认为我已经掌握了大部分基础知识。但是,我坚持的一件事是,有时我想使用自定义逻辑来填写模板。例如,如果有人生成我的原型并将 artifactId 指定为 hello-world,我想生成一个名为 HelloWorld 的类,它只打印出“Hello World!”。到控制台。如果另一个人使用 artifactId = howdy-there 生成它,生成的类将是 HowdyThere,它会打印出“你好!”。
我知道在幕后,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 指令。在指令类中,我有 render 方法将消息记录到 System.out,但该消息未显示在控制台中,因此我相信该方法从未在 archetype:generate 期间执行。
我在这里遗漏了一些简单的东西,还是这种方法不是可行的方法?