需求是根据模板类生成一些类。
看了一篇帖子Ant+Freemarker+xml 生成Html , 生成的文件名只能和模板类同名。查了freemarker的文档,没有发现支持这个功能。 FMPP 能够完成这个任务。
Download fmpp_0.9.14.tar.gz
目录结构
数据源books.xml
<?xml version="1.0" encoding="UTF-8"?> <classes> <packagename>org.myym.books</packagename> <class> <name>ScienceFiction</name> </class> <class> <name>Novel</name> </class> <pluginpackagename>org.myym.books.editor</pluginpackagename> </classes>
模板
<@pp.dropOutputFile /> <#list model.classes.class as class> <@pp.changeOutputFile name="${class.name}Editor.java" /> package ${model.classes.pluginpackagename}; import ${model.classes.pluginpackagename}.Type public class ${class.name}Editor{ protected String getEditorTitle() { return "${class.name} Editor"; } protected Type getType(){ return Type.${class.name?upper_case}; } } </#list>
模板文件的后缀名是任意的。这里命名成ftl是因为安装了'FreeMarker IDE' plug-in.可以高亮代码
<@pp.changeOutputFile name="${class.name}Editor.java" /> name可以指定文件夹 A.name="src/${class.name}Editor.java" 在模板文件路径下生成src的文件夹 并在src文件夹下生成.java文件 B.name="/src/${class.name}Editor.java' 则在destdir目录下生成src文件夹 <fmpp srcdir="templates" destdir="gen-out" logfile="log.fmpp" data="model:xml(../model/books.xml)"/>
build.xml
<project name="Fmpp-Ant" default="generate"> <taskdef name="fmpp" classname="fmpp.tools.AntTask"> <classpath> <fileset dir="lib"> <include name="*.jar" /> </fileset> </classpath> </taskdef> <target name="generate"> <fmpp srcdir="templates" destdir="gen-out" logfile="log.fmpp" data="model:xml(../model/books.xml)"/><!--relative path to 'srcdir'--> </target> <target name="clean" description="Deletes the output"> <delete includeemptydirs="true" verbose="true"> <fileset dir="." includes="gen-out/"/> </delete> </target> </project>
运行ant-task 'generate'后,刷新Project, 会生成一个文件夹'gen-out'