Så här kan en väldigt enkel Ant-task se ut. Denna task räknar rader i alla filer som anges med ett nästlat fileset
. (Stöd för nästlade filesets får jag genom att ärva från MatchingTask.)
Nästan det enda Ant-specifika är hur jag får tag på listan med filer, och att jag använder ”log()” för att skriva ut resultatet. Svårare än så behöver det inte vara.
package se.bluefish.ant;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.MatchingTask;
import org.apache.tools.ant.types.FileSet;
public class MetricsTask extends MatchingTask {
private String srcdir="src";
public void execute() throws BuildException {
String[] files = getDirectoryScanner(new File(srcdir)).getIncludedFiles();
int lines=0;
try {
for( int i=0; i<files.length; ++i ) {
lines += countLines(srcdir+File.separator+files[i]);
}
} catch (IOException e) {
throw new BuildException(e);
}
log("Lines: "+lines);
}
private int countLines(String filename) throws IOException {
BufferedReader in=null;
int lines = 0;
try {
in = new BufferedReader(new FileReader(filename));
while( in.readLine() != null ) {
++lines;
}
} finally {
if( in != null ) {
in.close();
}
}
return lines;
}
public void addConfiguredFileset(FileSet fs) {
fileset = fs; // fileset is a protected member of parent class
}
public void setSrcdir(String srcdir) {
this.srcdir = srcdir;
}
}
En enkel användning i en build.xml-fil kan se ut så här:
<project basedir=”.” default=”use” name=”ant-task-metrics”>
<target name=”build”>
<mkdir dir=”bin”></mkdir>
<javac destdir=”bin” srcdir=”src”></javac>
</target>
<target depends=”build” name=”createjar”>
<jar basedir=”bin” destfile=”ant-wc.jar”></jar>
</target>
<target depends=”createjar” name=”declare”>
<taskdef classname=”se.bluefish.ant.MetricsTask” classpath=”ant-wc.jar” name=”metrics”></taskdef>
</target>
<target depends=”declare” name=”use”>
<metrics srcdir=”src”>
<fileset>
<include name=”**/*.java”></include>
</fileset>
</metrics>
</target>
</project>