小编jit*_*h74的帖子

如何在Maven原型中提供自定义逻辑?

我有兴趣创建一个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>
Run Code Online (Sandbox Code Playgroud)

我的模板类看起来像这样......

package ${package};

public class #hyphenatedToCamelCase('$artifactId') {

    // userdirective = $userdirective
    public static void main(String[] args) {
        System.out.println("#hyphenatedToCamelCase('$artifactId')"));
    }
} 
Run Code Online (Sandbox Code Playgroud)

在我安装我的原型后然后做一个原型:通过指定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')"));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果表明,尽管userdirective按照我的预期方式设置,但它并没有像我希望的那样评估#hyphenatedToCamelCase指令.在指令类中,我有一个render方法将消息记录到System.out,但是该消息没有显示在控制台中,因此这让我相信该方法永远不会在archetype:generate期间执行.

我在这里错过了一些简单的东西,还是这种方法不是要走的路?

velocity archetypes maven

12
推荐指数
1
解决办法
2224
查看次数

标签 统计

archetypes ×1

maven ×1

velocity ×1