如何在 Maven 中使用模板代码生成器(例如 freemarker)?

Posted

技术标签:

【中文标题】如何在 Maven 中使用模板代码生成器(例如 freemarker)?【英文标题】:How do I use a template code generator (eg freemarker) in Maven? 【发布时间】:2011-04-24 21:56:39 【问题描述】:

您将如何将Freemarker(或替代方案)作为模板代码生成器构建到 Maven 项目中?我对 Maven 很陌生,希望能得到一些帮助。

我想从我项目中的模板生成一些代码。 [一]

不是自己写,而是通过谷歌搜索发现freemarker 似乎被Spring 使用,这对我来说是一个足够好的参考,尽管我还没有开始使用它,任何其他可以很好地使用的建议Maven 也将不胜感激。

This website 告诉我如何将它作为依赖项添加到我的 pom.xml 中。 This SO question 告诉我生成的源应该去哪里。我无法解决的是如何将它们联系在一起,所以我从模板生成了我的生成源,然后我生成的源像常规源一样用于编译、测试、jar、javadoc 等。其他人使用过maven 中的 java 模板代码生成器,可以提供帮助吗?

[a] 我知道泛型将是通常的解决方案,事实上我正在使用它们,但我必须使用模板来处理原始情况,而不会引入复制/粘贴错误。请相信我:-)

【问题讨论】:

【参考方案1】:

我为此编写了一个 maven 插件。它使用 FreeMarker 预处理器。

这是 pom.xml 中突出显示其用法的片段:

<plugins>
    <plugin>
        <configuration>
            <cfgFile>src/test/resources/freemarker/config.fmpp</cfgFile>
            <outputDirectory>target/test/generated-sources/fmpp/</outputDirectory>
            <templateDirectory>src/test/resources/fmpp/</templateDirectory>
        </configuration>
        <groupId>com.googlecode.fmpp-maven-plugin</groupId>
        <artifactId>fmpp-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

这里的 cfgFile 是您保存 FMPP 配置文件的路径。 (如果您没有使用 FreeMarker 中传递的任何特殊数据,那么一个空文件就足够了) templateDirectory 是您保存 FreeMarker 模板的地方。 outputDirectory 是您希望生成输出文件的位置。

我正在编写详细说明插件使用的详细文档,并将相应地更新project website。

【讨论】:

文档进展如何? :-) 我不知道如何从 pom(例如 project.version)传递值,以便 freemarker 插件知道它们。 感谢插件!这对我刚刚写的一个库非常有用! github.com/mintern-java/functions @bacar:看看 Brandon Mintern 的 GitHub 项目中的一个很好的工作示例:github.com/mintern-java/primitive【参考方案2】:

这是该工作的另一个插件: https://code.google.com/p/maven-replacer-plugin/

从问题的原始描述看来,您应该考虑创建一个 Maven Archetype(又名项目模板): http://maven.apache.org/archetype/maven-archetype-plugin/

听起来您可能想在等式中添加一些属性: http://maven.apache.org/archetype/maven-archetype-plugin/examples/create-with-property-file.html

Maven Archetype 功能还提供了一种使用 Apache Velocity 进行替换的方法(与 Freemarker 几乎相同)......但我还没有解决这个问题。

【讨论】:

可悲的是,即使是 Github 端口 github.com/beiliubei/maven-replacer-plugin 和分叉也有很多技术债务,所以它看起来不能按原样使用。我认为原型方法不会在代码构建器项目中起作用。

以上是关于如何在 Maven 中使用模板代码生成器(例如 freemarker)?的主要内容,如果未能解决你的问题,请参考以下文章

使用-f选项时,Maven重复类具有生成的源代码

IntelliJ:自定义代码生成模板

如何在列表 django 模板列表中使用变量

Maven用项目模板生成项目

如何使用来自 Hudson 的 Maven 生成 Cobertura 代码覆盖率报告

Swagger结合mustache模板生成后台接口代码以及前后台建模代码