Ant简介
- Ant是一个构建工具,是一个小程序。但是它通过自动完成所有的编译代码,运行测试以及打包重新部署的结果等繁琐费力的任务来帮助软件团队开发大程序。
- Ant 使用Java编写,跨平台,易使用且可伸缩。既可以用在小型个人项目中,也可以用于大型多团队软件项目。
- Ant的目标是自动完成所有的构建过程。
Ant核心概念
- 构建文件:Ant使用称之为构建文件的xml文件来描述如何构建工程,在这个文件里,开发者列出各种构建目标(target)以及达到这些目标的任务(task)。
- 构建文件与项目、项目与目标、目标与任务的关系
- 一个构建文件包含一个项目,每个项目包含多个目标,目标依赖于其他目标,目标包含任务而任务是做工作的。
Ant下载与安装
Ant下载
下载网址:http://ant.apache.org/
当前最新版本:1.9.3
笔记中使用版本:1.8.4
Ant安装
通过配置环境变量,建立“ANT_HOME”并将其放入到“Path”中,如下图所示:
验证Ant是否安装成功
当出现如下界面时表示已经安装成功
Ant案例之Hello World
操作步骤
新建空文件夹,名称为demo
新建一个Java文件,名称为HelloWorld.java,其内容如下所示
class HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
class HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
编写build.xml
<?xml version="1.0" ?>
<project name="firstbuild" default="run">
<target name="init">
<mkdir dir="build/classes" />
<mkdir dir="dist" />
</target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="build/classes" />
<echo>编译完成!</echo>
</target>
<target name="archive" depends="compile">
<jar destfile="dist/project.jar" basedir="build/classes" />
</target>
<target name="clean" depends="init">
<delete dir="build" />
<delete dir="dist" />
</target>
<target name="run" depends="compile">
<java classname="HelloWorld" classpath="build/classes" />
</target>
</project>
<?xml version="1.0" ?>
<project name="firstbuild" default="run">
<target name="init">
<mkdir dir="build/classes" />
<mkdir dir="dist" />
</target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="build/classes" />
<echo>编译完成!</echo>
</target>
<target name="archive" depends="compile">
<jar destfile="dist/project.jar" basedir="build/classes" />
</target>
<target name="clean" depends="init">
<delete dir="build" />
<delete dir="dist" />
</target>
<target name="run" depends="compile">
<java classname="HelloWorld" classpath="build/classes" />
</target>
</project>
使用命令行方式运行ant
运行时报错,HelloWorld类必须是public类型
修改后HelloWorld类如下所示
<span style="background-color: rgb(255, 0, 0);">public class</span> HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
<span style="background-color: rgb(255, 0, 0);">public class</span> HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
重新编译运行显示成功
编译运行成功后文件显示
说明:将java工程分成源代码文件夹,编译后文件存放位置,发布打包文件的存放位置。
src:源代码文件夹
build:所有在构建时产生的文件
build/classes:中间输出
dist:最终打包分发文件
Ant属性
一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在“{”和“}”之间并放在属性值的位置来实现的。
Ant任务
Ant任务(task)
- 一个task是一段可执行的代码。
- 一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。
- 下面是Task的一般构造形式:
• <taskname attribute1="value1"attribute2="value2" ... />
• 这里taskname是task的名字,attributeN是属性名,valueN是属性值。
• 有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。
- 所有的task都有一个task名字属性。Ant用属性值来产生日志信息。
demo.xml文件内容如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
</project>
运行结果如下所示
Ant核心任务之copy
拷贝单个的文件
<copy file="myfile.txt" tofile="mycopy.txt"/>
拷贝单个的文件到指定目录下
<copy file="myfile.txt" todir="../some/other/dir"/>
拷贝一个目录到另外一个目录下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
拷贝一批文件到指定目录下
<copy todir="../dest/dir">
<fileset dir="src_dir">
<include name="**/*.java"/>
<exclude name="**/Test.java"/>
</fileset>
</copy>
<copy todir="../dest/dir">
<fileset dir="src_dir" excludes="**/*.java"/>
</copy>
demo.xml文件内容如下所示:
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
</project>
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
</project>
运行结果如下所示:
Ant核心任务之delete
删除一个文件
<delete file="/lib/ant.jar"/>
删除指定目录及其子目录
<delete dir="lib"/>
删除指定的一组文件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
demo.xml文件内容如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
<!--One Target-->
<target name="demo5">
<echo message="Delete files"/>
<delete dir="mydelete"/>
</target>
</project>
运行结果如下所示
Ant核心任务之move
移动或重命名一个文件
<move file="file.orig" tofile="file.moved"/>
<move file="file.orig" tofile="file.moved"/>
移动或重命名一个文件到另一个文件夹下面
<move file="file.org" todir="dir/to/move/to"/>
<move file="file.org" todir="dir/to/move/to"/>
将一个目录移到另外一个目录下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
将一组文件移动到另外的目录下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
demo.xml文件内容如下所示
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
<!--One Target-->
<target name="demo5">
<echo message="Delete files"/>
<delete dir="mydelete"/>
</target>
<!--One Target-->
<target name="demo6">
<echo message="Move files"/>
<move todir="mymove/dir">
<fileset dir="move/dir">
<include name="**/*.java"/>
<exclude name="**/Mavs.java"/>
</fileset>
</move>
</target>
</project>
运行结果如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
<!--One Target-->
<target name="demo5">
<echo message="Delete files"/>
<delete dir="mydelete"/>
</target>
<!--One Target-->
<target name="demo6">
<echo message="Move files"/>
<move todir="mymove/dir">
<fileset dir="move/dir">
<include name="**/*.java"/>
<exclude name="**/Mavs.java"/>
</fileset>
</move>
</target>
</project>
Ant核心任务之javac(编译java源代码)
格式1
<javac srcdir="{src}“ destdir="{build}“ classpath="xyz.jar“ debug="on"/>
编译{src}目录及其子目录下的所有Java文件。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息
格式2
<javac srcdir="{src}:{src2}“ destdir="{build}“ includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**“ classpath="xyz.jar"debug="on"/>
在javac中指定属性
<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="{src}“ destdir="{src}“ classpath="{classpath}“ debug="on"/>
<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="{src}“ destdir="{src}“ classpath="{classpath}“ debug="on"/>
路径是在property中定义的
Ant核心任务之javac(执行指定Java类)
案例一
<java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="{java.class.path}"/>
</classpath>
</java>
classname中指定要执行的类,classpath设定要使用的环境变量
案例二
<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="{java.class.path}/"/>
<pathelement path="{additional.path}"/>
</path>
<java classname="test.Main">
<classpath refid="project.class.path"/>>
</java>
Ant核心任务之jar
<jar destfile="{dist}/lib/app.jar” basedir="{build}/classes"/>
将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中
Ant核心任务之war
对Jar的扩展,用于打包Web应用;
案例:假设文件目录如下
thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif
下面是任务的内容
<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
<fileset dir="src/html/myapp"/>
<fileset dir="src/jsp/myapp"/>
<lib dir="thirdparty/libs">
<exclude name="jdbc1.jar"/>
</lib>
<classes dir="build/main"/>
<zipfileset dir="src/graphics/images/gifs" prefix="images"/>
</war>
完成后的结果
WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif
Eclipse对Ant的支持