<?xml version="1.0" encoding="utf-8" ?>
<project default="compile" basedir=".">
<!--定义全局变量,便于target中进行引用-->
<property name="src" value="src"></property>
<property name="dest" value="dest"></property>
<property name="dist" value="dist"></property>
<tstamp></tstamp> <!--便于下文引用TSTAMP,DSTAMP,TODAY(大写)等当前日期 -->
<property name="cvsRoot" value=":pserver:qinyushuang:pwd:localhost:d:\cvs"></property>
<property name="cvsDesLocation" value="myCVS"></property>
<target name="init">
<mkdir dir="${src}"/>
<mkdir dir="${dest}"/>
<mkdir dir="${cvsDesLocation}"/>
</target>
<target name="second" depends="init"></target>
<target name="third" depends="init,second"></target> <!--一个target依赖多个其他的target时,用分号隔开-->
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>
<target name="package" depends="compile" >
<jar destfile="${dist}/pakeage-${DSTAMP}.jar" basedir="${dest}"> <!--这里的DSTAMP是代表yyyymmdd,前提上文中必须有tstamp标签-->
<manifest> <!--打的jar包中将会生成一个MANIFEST文件,里面加上下面两句的属性-->
<attribute name="Build-By" value="${user.name}"/>
<attribute name="Main-Class" value="TestFrame"/>
</manifest>
</jar>
</target>
<target name="deleteFileAndDir" depends="package"> <!--删除文件和目录-->
<delete file="${dist}/package.jar"></delete>
<delete dir="${dist}"></delete>
</target>
<target name="copyAndMove"> <!--移动和复制文件-->
<copy file="src/111.txt" tofile="src/222.txt" verbose="true"></copy>
<copy file="src/111.txt" todir="${basedir}" verbose="true"></copy>
<move file="src/111.txt" tofile="src/333.txt" verbose="true"></move>
<move file="src/333.txt" todir="${basedir}" verbose="true"></move>
</target>
<target name="zipAndUnzip"> <!--压缩和解压文件-->
<zip destfile="${dest}/output.zip" basedir="${src}"></zip>
<unzip dest="${src}" src="${dest}/output.zip"></unzip>
</target>
<target name="cvs"> <!--从cvs中checkout代码-->
<cvs cvsroot="${cvsRoot}" package="java_interview" command="checkout" dest="${cvsDesLocation}" depends="init"></cvs>
</target>
<target name="replace"> <!--替换文件中的字符串-->
<replace file="input.txt" token="old" value="new" summary="true"></replace>
</target>
<target name="match"> <!--模式匹配src*/*.java 匹配src开头的目录下所有java文件;**/*.java匹配任意数量目录的java-->
<copy todir="${dest}">
<fileset dir="${src}">
<include name="**/*.txt" />
<include name="**/*.pdf" />
<exclude name="**/1.txt"/>
</fileset>
</copy>
</target>
<!--会自动创建与src同级的一个bin目录,目录下的文件结构与classname的包结构相同-->
<taskdef name="myFileSorterExample" classname="com.test.ant.extend.FileSort" classpath="bin"></taskdef>
<target name="myFileSorter" >
<myFileSorterExample srcFile="input.txt" destFile="output.txt" />
</target>
</project>
最后一个自定义标签myFileSorterExample用到的一个java类,需要继承org.apache.tools.ant.Task,重写execute方法。
package com.test.ant.extend;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class FileSort extends Task {
private File srcFile;
private File destFile;
public File getSrcFile() {
return srcFile;
}
public void setSrcFile(File srcFile) {
this.srcFile = srcFile;
}
public File getDestFile() {
return destFile;
}
public void setDestFile(File destFile) {
this.destFile = destFile;
}
@Override
public void execute()throws BuildException {
try{
BufferedReader fromFile = new BufferedReader(new FileReader(srcFile));
BufferedWriter toFile = new BufferedWriter(new FileWriter(destFile));
List<String> list = new ArrayList<String>();
String line = fromFile.readLine();
while(line != null)
{
list.add(line);
line = fromFile.readLine();
}
Collections.sort(list);
for(ListIterator<String> li = list.listIterator();li.hasNext();)
{
String str = (String) li.next();
toFile.write(str);
toFile.newLine();
}
fromFile.close();
toFile.close();
}catch(Exception ex)
{
ex.printStackTrace();
}
}
}