1.说明
apache ant是一个轻量级的、基于命令行的工程管理工具。
2.安装ant
(1)ant下载:http://ant.apache.org/bindownload.cgi
(2)解压下载的包到任意目录,记住目录,例如我的是:C:\apache-ant-1.9.2
(3)设置环境变量,ANT_HOME:C:\apache-ant-1.9.2,path:;C:\apache-ant-1.9.2。输入 ant -help 测试。
3.准备一个工程HelloWorld
在工作空间创建一个目录:antdemo作为工程根目录,创建src目录,存放java源文件。
创建源文件:rc\oata\HelloWorld.java
package oata;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
4.简单的ant工程管理
ant管理工程使用的是一个名为build.xml的文件,运行ant命令,会查找目录下的build.xml,按照他定义的规则运行。build.xml一般放在工程根目录下。
下面是一个简单的build.xml
<project>
<!--定义清除命令-->
<target name="clean">
<!--删除目录-->
<delete dir="build"/>
</target>
<!--定义编译命令-->
<target name="compile">
<!--创建目录-->
<mkdir dir="build/classes"/>
<!--调用javac,相当于javac -sourcepath src -d build\classes src\oata\HelloWorld.java -->
<javac srcdir="src" destdir="build/classes"/>
</target>
<!--定义打包命令,把编译的class文件打包成一个jar文件-->
<target name="jar">
<mkdir dir="build/jar"/>
<!-- 调用jar打包-->
<jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
<manifest>
<attribute name="Main-Class" value="oata.HelloWorld"/>
</manifest>
</jar>
</target>
<!--运行 -->
<target name="run">
<!--调用java执行-->
<java jar="build/jar/HelloWorld.jar" fork="true"/>
</target>
</project>
build.xml文件的主要内容是一大堆target,相当于makefile中的任务,例如上面定义了name=“clean”的target,就可以在命令行ant clean来执行任务。
命令行执行:ant compile jar run
结果:
5.改进build.xml
上面的build文件,有很多可以改进的地方。
1.build.xml可以通过
<property name="src.dir" value="src"/>
定义属性,可以复用属性
2.target可以依赖另一个target。
改进后的build.xml文件
<?xml version="1.0" encoding="windows-1250"?>
<project name="HelloWorld" basedir="." default="main">
<!--定义属性src.dir-->
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="oata.HelloWorld"/>
<!--定义清除命令-->
<target name="clean">
<!--删除目录-->
<delete dir="${build.dir}"/>
</target>
<!--定义编译命令-->
<target name="compile">
<!--创建目录-->
<mkdir dir="${classes.dir}"/>
<!--调用javac,相当于javac -sourcepath src -d build\classes src\oata\HelloWorld.java -->
<javac srcdir="${src.dir}" destdir="${classes.dir}"/>
</target>
<!--定义打包命令,把编译的class文件打包成一个jar文件-->
<target name="jar">
<mkdir dir="${jar.dir}"/>
<!-- 调用jar打包-->
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<!--运行 -->
<target name="run" depends="compile,jar">
<!--调用java执行-->
<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
</target>
<!--定义clean-build,依赖于clean和jar-->
<target name="clean-build" depends="clean,jar"/>
<!--定义main,依赖于clean和run-->
<target name="main" depends="clean,run"/>
</project>
6.使用外部库
使用log4j打印log:
package oata;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
public class HelloWorld {
static Logger logger = Logger.getLogger(HelloWorld.class);
public static void main(String[] args) {
BasicConfigurator.configure();
logger.info("Hello World"); // the old SysO-statement
}
}
增加外部库,编译(compile)的使用需要使用,运行(run)也需要使用。
build文件修改如下:
<!--定义外部库的存放目录-->
<property name="lib.dir" value="lib"/>
<!--定义一个path元素,指定id属性,供后面引用-->
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
......
<!--定义编译命令-->
<target name="compile">
<!--创建目录-->
<mkdir dir="${classes.dir}"/>
<!--调用javac,相当于javac -sourcepath src -d build\classes src\oata\HelloWorld.java -->
<!--引用classpath-->
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
</target>
<!--运行 -->
<target name="run" depends="compile,jar">
<!--调用java执行-->
<java classname="${main-class}" fork="true">
<!--定义classpath-->
<classpath >
<path refid="classpath"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</java >
</target>
7.外部文件复制
有时应用运行需要要外部配置文件,例如log4j的配置文件:log4j.properties。
创建文件:resource/log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n
修改compile,
<!--定义编译命令-->
<target name="compile">
<!--创建目录-->
<mkdir dir="${classes.dir}"/>
<!--调用javac,相当于javac -sourcepath src -d build\classes src\oata\HelloWorld.java -->
<!--引用classpath-->
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
<!--复制配置文件-->
<copy todir="${classes.dir}">
<fileset dir="${resource.dir}" excludes="**/*.java"/>
</copy>
</target>
8.使用junit测试
(1)下载junit.jar 放入,lib目录
(2)写测试代码:新建src/test/HelloWorldTest.java
package test;
import junit.framework.*;
public class HelloWorldTest extends junit.framework.TestCase {
public void testNothing() {
}
public void testWillAlwaysFail() {
fail("An error message");
}
}
(3)修改build.xml
<!--定义应用的path,用于测试-->
<path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
......
<!--运行 -->
<target name="run" depends="jar">
<!--调用java执行-->
<java classname="${main-class}" fork="true">
<!--定义classpath-->
<classpath >
<path refid="classpath"/>
<path refid="application"/>
</classpath>
</java >
</target>
<!--定义测试任务 -->
<target name="junit" depends="jar" >
<junit printsummary="yes">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
<batchtest fork="yes">
<fileset dir="${src.dir}" includes="test/*Test.java"/>
</batchtest>
</junit>
</target>
运行ant junit
结果:
最后的build.xml文件
<?xml version="1.0" encoding="windows-1250"?>
<project name="HelloWorld" basedir="." default="main">
<!--定义属性src.dir-->
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="oata.HelloWorld"/>
<!--定义外部库的存放目录-->
<property name="lib.dir" value="lib"/>
<!--配置文件目录-->
<property name="resource.dir" value="resource" />
<!--定义一个path元素,指定id属性,供后面引用-->
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<!--定义应用的path,用于测试-->
<path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
<!--定义清除命令-->
<target name="clean">
<!--删除目录-->
<delete dir="${build.dir}"/>
</target>
<!--定义编译命令-->
<target name="compile">
<!--创建目录-->
<mkdir dir="${classes.dir}"/>
<!--调用javac,相当于javac -sourcepath src -d build\classes src\oata\HelloWorld.java -->
<!--引用classpath-->
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
<!--复制配置文件-->
<copy todir="${classes.dir}">
<fileset dir="${resource.dir}" excludes="**/*.java"/>
</copy>
</target>
<!--定义打包命令,把编译的class文件打包成一个jar文件-->
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<!-- 调用jar打包-->
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<!--运行 -->
<target name="run" depends="jar">
<!--调用java执行-->
<java classname="${main-class}" fork="true">
<!--定义classpath-->
<classpath >
<path refid="classpath"/>
<path refid="application"/>
</classpath>
</java >
</target>
<!--定义clean-build,依赖于clean和jar-->
<target name="clean-build" depends="clean,jar"/>
<!--定义clean-build,依赖于clean和run-->
<target name="main" depends="clean,run"/>
<!--定义测试任务 -->
<target name="junit" depends="jar" >
<junit printsummary="yes">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
<batchtest fork="yes">
<fileset dir="${src.dir}" includes="test/*Test.java"/>
</batchtest>
</junit>
</target>
</project>