这篇文章的话,主要来演示一下,怎么利用Ant将一个初步的项目模版生成。
首先,我们来看一下这个Demo的目录结构:
Template目录里面存放着java文件(包名/类名.java)
其中包名和类名都是一个$符号包围的字符串,这些主要是取决你要生成什么名字的项目
现在,再来看看$IVAN_CLASS$.java里面的代码:
- package $IVAN_PACKAGE$;
- public class $IVAN_CLASS$
- {
- ……………………
- }
package $IVAN_PACKAGE$;
public class $IVAN_CLASS$
{
……………………
}
里面的代码,也是再项目生成后,会替换成相应的名字.
现在,外面在Template的同级目录下面,建立我们的ant脚本: build.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <project name="GenFileByTemplate" basedir="." default="generFile">
- <!-- 接受用户输入 -->
- <target name="input-args" depends="" description="接受包名输入">
- <echo message="================="/>
- <echo message="====开始生成文件====="/>
- <echo message="================="/>
- <!-- 包名设置 -->
- <input addproperty="package" message="请输入包名:"/>
- <condition property="p_name" value="${package}">
- <not>
- <equals arg1="${package}" arg2="" trim="true"/>
- </not>
- </condition>
- <fail unless="p_name" message="包名不能为空^o^"/>
- <!-- 类名设置 -->
- <input addproperty="classname" message="请输入类名:"/>
- <condition property="c_name" value="${classname}">
- <not>
- <equals arg1="${classname}" arg2="" trim="true"/>
- </not>
- </condition>
- <fail unless="c_name" message="类名不能为空^o^"/>
- </target>
- <target name="generFile" depends="input-args" description="根据模版生成文件">
- <filterset id="filterfile" begintoken="$" endtoken="$">
- <filter token="IVAN_PACKAGE" value="${package}"/>
- <filter token="IVAN_CLASS" value="${classname}"/>
- </filterset>
- <!-- 创建目的目录 -->
- <mkdir dir="./dist"/>
- <!-- 从一个目录拷贝至另外一个目录 -->
- <!--执行到这里,会将$IVAN_CLASS$.java文件里面的代码改掉$-->
- <copy todir="./dist" overwrite="true">
- <fileset dir="./template">
- <include name="$IVAN_PACKAGE$/*.java"/>
- </fileset>
- <filterset refid="filterfile"/>
- </copy>
- <!-- 一下会将文件名跟目录名改掉 -->
- <move file="./dist/$IVAN_PACKAGE$/$IVAN_CLASS$.java" tofile="./dist/${package}/${classname}.java"/>
- <delete dir="./dist/$IVAN_PACKAGE$"/>
- </target>
- </project>
<?xml version="1.0" encoding="UTF-8"?> <project name="GenFileByTemplate" basedir="." default="generFile"> <!-- 接受用户输入 --> <target name="input-args" depends="" description="接受包名输入"> <echo message="================="/> <echo message="====开始生成文件====="/> <echo message="================="/> <!-- 包名设置 --> <input addproperty="package" message="请输入包名:"/> <condition property="p_name" value="${package}"> <not> <equals arg1="${package}" arg2="" trim="true"/> </not> </condition> <fail unless="p_name" message="包名不能为空^o^"/> <!-- 类名设置 --> <input addproperty="classname" message="请输入类名:"/> <condition property="c_name" value="${classname}"> <not> <equals arg1="${classname}" arg2="" trim="true"/> </not> </condition> <fail unless="c_name" message="类名不能为空^o^"/> </target> <target name="generFile" depends="input-args" description="根据模版生成文件"> <filterset id="filterfile" begintoken="$" endtoken="$"> <filter token="IVAN_PACKAGE" value="${package}"/> <filter token="IVAN_CLASS" value="${classname}"/> </filterset> <!-- 创建目的目录 --> <mkdir dir="./dist"/> <!-- 从一个目录拷贝至另外一个目录 --> <!--执行到这里,会将$IVAN_CLASS$.java文件里面的代码改掉$--> <copy todir="./dist" overwrite="true"> <fileset dir="./template"> <include name="$IVAN_PACKAGE$/*.java"/> </fileset> <filterset refid="filterfile"/> </copy> <!-- 一下会将文件名跟目录名改掉 --> <move file="./dist/$IVAN_PACKAGE$/$IVAN_CLASS$.java" tofile="./dist/${package}/${classname}.java"/> <delete dir="./dist/$IVAN_PACKAGE$"/> </target> </project>
这里,我在脚本里面有了详细的注释,如果我们执行ant ,则可以像项目模版的生成(like appfuse 的生成功能).
这里截图来看
当前的目录结构:
下面我们来执行脚本,这里会要求你输入你的包名和类名,这个DEMO的包名只是象征性的输入了一个单词
(有可能会输入像,com.xx.xx ,如此的话,就必须产生多级目录,这里只是做演示,则没处理,有兴趣的朋友,可以自己尝试下):
OK,现在我们再来看目录结构(会产生一个dist目录, 下面有模版中的文件,但是名字都变成你输入的包名和类名了):
OK, 这样我们就把项目结构生成出来了,而且还是根据我们输入的参数来产生相应的包和类的。
那么我们java文件的代码是否也同时更改了呢? 让我们来看看java文件的代码:
自此,这个DEMO已经完成