Ant安装
第一步下载
http://ant.apache.org/
第二步解压文件介绍
bin:批处理文件
etc:外部依赖的文件
lib:库
manual:帮助指南
第三步配置环境变量
配置Ant前提是java的环境变量必须配置好
ANT_HOME = D:\Program Files\apache-ant-1.9.2
path = D:\Program Files\apache-ant-1.9.2\bin
第四步测试配置是否成功
如果在命令行输入ant出现
Buildfile: build.xml does not exist!
Build failed
说明配置成功
设置Ant文档路径(编写Ant提示)
设置Ant运行环境(默认运行环境是JDK的)
Ant简介
Apache Ant是基于Java的生成工具
全称是 another neat tool(另一个整洁工具的意思),简写是 ant(蚂蚁的意思)
Ant是一个名叫build的xml文件
是通过build.xml来进行构件的
Ant的project标签是根元素,target标签每一项具体的任务
命令行执行Ant
构件脚本为
<?xml version="1.0" encoding="UTF-8"?>
<!--先删除后加helloworld文件夹-->
<project default="second">
<target name="init">
<delete dir="helloworld" />
</target>
<target name="second" depends="init">
<mkdir dir="helloworld" />
</target>
</project>
隐式执行
如果构件脚本名称为build.xml
D:\>ant
如果构件脚本名称不为build.xml,而是其他的(用mybuild.xml举例)
D:\>ant -f mybuild.xml
显式执行
如果构件脚本名称为build.xml
D:\>ant init second
如果构件脚本名称不为build.xml,而是其他的(用mybuild.xml举例)
D:\>ant -f mybuild.xml init second
如果build文件在MyEclipse项目中可以点击build.xml右键选择Run As执行
使用MyEclipse自带插件单个运行Ant
Ant注释/描述
第一种使用description属性
<target name="init" description="删除文件">
<delete dir="helloworld" />
</target>
第二种使用description标签
<description>删除文件</description>
<target name="init">
<delete dir="helloworld" />
</target>
Ant模式匹配
对目录进行匹配
例如
src*/*.java
将匹配带src前缀的任何目录中的所有.java文件
**/*.java
目录结构下所有.java文件
需要注意的是*/和**/是不一样的,一个是当前目录下,一个是所有目录下
Ant拷贝文件
copy标签分析
file属性 源文件
tofile属性 目标文件
拷贝一
<target name="init">
<delete dir="build" />
<mkdir dir="build/src" />
<copy file="src/com/itlwc/HelloWorld.java" tofile="c:/CopyHelloWorld.java">
</copy>
</target>
拷贝二(具有剪切功能,拷贝之后源文件删除)
<target name="init">
<delete dir="build" />
<mkdir dir="build/src" />
<copy file="src/com/itlwc/HelloWorld.java" tofile="c:/CopyHelloWorld.java">
</copy>
</target>
copy标签分析
todir属性 拷贝到那
refid属性 依赖(从那拷贝)
fileset标签分析
fileset可以设定一组文件集进行操作,
dir指明文件集要进行选择的路径,
id可以指定这个文件的名称,在使用的时候进行直接引用
include表示包含,
exclude表示排除
<fileset id="src.path" dir="src">
<!--包括所有目录下的所有文件-->
<include name = "**/*.*"/>
<!--排除T开头的文件-->
<exclude name = "**/T*"/>
<!--排除.java文件-->
<exclude name = "**/*.java"/>
</fileset>
拷贝三(引用内部文件集)
<target name="init">
<delete dir="build" />
<mkdir dir="build/src" />
<copy todir="build/src">
<fileset dir="src" includes="**/*.*" />
</copy>
</target>
拷贝四(引用外部文件集id)
<fileset id="src.path" dir="src" includes="**/*.*" />
<target name="init">
<delete dir="build" />
<mkdir dir="build/src" />
<copy todir="build/src">
<fileset refid="src.path"></fileset>
</copy>
</target>
拷贝五(引用外部文件集id另一种写法)
<fileset id="src.path" dir="src">
<include name = "**/*.*"/>
</fileset>
<target name="init" depends="init">
<delete dir="build" />
<mkdir dir="build/src" />
<copy todir="build/src">
<fileset refid="src.path"></fileset>
</copy>
</target>
Ant编译Java文件
javac标签分析
destdir 编译到那
srcdir 编译的src的路径
编译
<target name="init">
<delete dir="build"/>
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"></javac>
</target>
javac任务的重要特点在于,它仅编译那些认为需要编译的文件,
如果某个类的已经存在,并且对应的源文件没有改变过,不会被重新编译
Ant创建JAR文件
JAR文件能够包含任意类型的文件,比如class文件,XML文件,图片,清单文件等等
jar标签分析
destfile属性 打包到那
basedir属性 打包那些
打包代码
<!--打包必须先编译-->
<target name="init">
<delete dir="build" />
<mkdir dir="build/classes" />
<mkdir dir="build/dist" />
<javac srcdir="src" destdir="build/classes">
</javac>
<jar destfile="build/dist/package.jar" basedir="build/classes">
</jar>
</target>
创建JAR时会在JAR中再生成META-INF/MANIFEST.MF文件,文件(清单文件)内容如下
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 22.1-b02 (Oracle Corporation)
对于图形界面程序来说,打成架包是可以直接双击去运行的,要想实现双击运行,
必须在清单文件中有Main-Class(包含main()主类的名字),内容如下
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 22.1-b02 (Oracle Corporation)
Main-Class: com.itlwc.HelloWorld
打架包时手动配置清单文件
配置如下
<!--打包必须先编译-->
<target name="init">
<delete dir="build" />
<mkdir dir="build/classes" />
<mkdir dir="build/dist" />
<javac srcdir="src" destdir="build/classes" />
<jar destfile="build/dist/package.jar" basedir="build/classes">
<!--指定我们可用的属性-->
<manifest>
<!--
user.name使用自己的名字(不需要自定义Ant内置的属性)
Ant内置的属性是从Java的属性文件中提取出来的
user.name表示登陆操作系统的用户名
-->
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="com.itlwc.HelloWorld" />
</manifest>
</jar>
</target>
生成的清单文件如下
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 22.1-b02 (Oracle Corporation)
Built-By: Lwc
Main-Class: com.itlwc.HelloWorld
Ant运行
HelloWorld.java
package com.itlwc;
public class HelloWorld {
public static void main(String[] args) {
for (String arg : args) {
System.out.println("hello "+arg);
}
}
}
bulid.xml
<project default="init">
<fileset id="src.path" dir="src">
<include name="**/*.*" />
</fileset>
<target name="init">
<delete dir="build" />
<mkdir dir="build/classes" />
<mkdir dir="build/dist" />
<javac srcdir="src" destdir="build/classes" />
<jar destfile="build/dist/package.jar" basedir="build/classes">
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="com.itlwc.HelloWorld" />
</manifest>
</jar>
<echo>基于类路径的classname来执行</echo>
<java classname="com.itlwc.HelloWorld" classpath="build/classes">
<arg value="张三" />
<arg value="李四" />
<arg value="王五" />
</java>
<echo>基于jar来执行</echo>
<java jar="build/dist/package.jar" fork="true">
<arg value="张三" />
<arg value="李四" />
<arg value="王五" />
</java>
</target>
</project>
Ant对CVS的支持
CVS任务的主要属性是cvsRoot,它是对CVS库的完整引用,包括连接方法和用户详细信息
参数如下
[:method:][
[user][:password]@
]hostname[:
[port]
]/path/to/repository
提取是CVS任务的默认操作,其他操作可以通过使用command属性来指定,配置如下
cvsRoot标签分析
package cvs下具体项目
command 对这个项目做什么操作
dest 操作到那里
案例
<!--
pserver 连接的方式(默认的)
Lwc 登陆操作系统的用户名
123456 登陆的密码
127.168.0.1 登陆机器的IP地址
c:\cvs cvs的仓库路径
-->
<target name="init">
<cvs cvsroot=":pserver:Lwc:123456@127.168.0.1:c:\cvs"
package="Ant"
command="checkout"
dest="c:\mycvs">
</cvs>
</target>
Ant生成时间戳
用来表示时间戳
时间戳就是生成环境中使用当前时间和日期(一般用在记录生成的时间)
有时候不需要属性,许多情况下使用<tstamp/>就行了
三个属性
DSTAMP 默认格式yyyymmdd 20140406
TSTAMP 默认格式hhmm 1603
TODAY 完整时间 2014年04月06日
案例
<target name="dist" depends="myCompile">
<!--获取当前时间,tstamp必须写,DSTAMP才能输出时间-->
<tstamp></tstamp>
<!--使用DSTAMP-->
<jar destfile="build/dist/package-{$DSTAMP}.jar" basedir="build/src"></jar>
</target>
生成JAR文件为: package-20140406.jar
Ant 替换和查找任务
执行文件中的替换和查找
replace标签分析
file 查找的文件
token 查找的字符串
value 新的字符串
summary 提供详细信息,true或者false,执行的数目
案例
<target name="init">
<replace
file="src/com/itlwc/HelloWorld.java"
token="hello" value="Hello"
summary="ture">
</replace>
</target>
Ant属性
Ant的值一旦被设置不能被改变
定义属性使用property标签
<property name="属性的名字" value="属性的值"/>
使用方法(直接使用)
<!--创建helloworld文件夹-->
<project default="init">
<property name="createFile" value="helloworld" />
<target name="init">
<!--这里的${createFile}将会被替换成helloworld-->
<mkdir dir="${createFile}" />
</target>
</project>
使用方法(嵌套使用)
<!--创建helloworldGo文件夹-->
<project default="init">
<property name="createFile" value="helloworld" />
<target name="init">
<!--这里的${createFile}Go将会被替换成helloworldGo-->
<mkdir dir="${createFile}Go" />
</target>
</project>
使用属性定义相应路径时,一定使用个location不使用value,
location属性自动转换为当前系统可以识别的路径(只能处理路径地址)
<property name="createFile" location="helloworld/abc"/>
如果属性太多可以把属性定义在外部properties文件
build.properties
createFile=helloworld
build.xml
<project default="init">
<property file="build.properties"/>
<target name="init">
<mkdir dir="${createFile}" />
</target>
</project>
特别注意,路径不建议在外部properties文件中定义,此时就不会设置location的值
Ant内置属性
<?xml version="1.0" encoding="UTF-8"?>
<project>
<!--build.xml路径-->
<echo>${ant.file}</echo>
<!--ant路径-->
<echo>${ant.home}</echo>
<!--JDK版本-->
<echo>${ant.java.version}</echo>
<!--ant库路径-->
<echo>${ant.library.dir}</echo>
<!--ant版本号-->
<echo>${ant.version}</echo>
<!--把环境变量的参数导入到env这个变量中-->
<property environment="env" />
<!--Java路径-->
<echo>${env.JAVA_HOME}</echo>
</project>