1,ant <参数>
ant -propertyfile ftp.proerties :需要额外的调用属性文件,ftp.proerties文件中内容指定如下:
server.name=10.8.32.1
ftp.username=feeapp
ftp.password=feeapp
-projecthelp, -p :打印出关于buildfile的信息,包含主目录和其子目录。
-version :ant版本号。
-debug, -d :显示ant执行调试的信息,
-lib<path> 指定一个类库所在的位置(jar文件位置),让ant工具可以使用这些类文件。path指定类文件。
-quiet , -q 隐藏ant执行的提示输出信息。
-verbose, -v 显示ant执行的详细信息,包括系统、Java.
-buildfile file, 这里指定xml文件,名称不是bulid.xml时使用。eg:ant -buildfile bu.xml
-D<property>=<value> 用于设置一些变量可以在target中直接引用,或覆盖已设定的属性。eg:ant -Dwho=wzj
通过-D来指定属性优先于-propertyfile的方式。会使用-D指定的。
控制台下设置属性两种方式:-D和-propertyfile 注意:在控制台上设置的属性是不可能被修改的,即使使用<available>或<condition>也不行。
2, Ant属性:用${}来获取属性值:eg:${os.name}
os.name :操作系统的名称。
basedir :项目引用的根路径。
ant.home :ant工具的根目录位置。
ant.file :构建文件的绝对路径。
ant.version :ant的版本信息。
ant.java.version :ant检测到的JVM版本。
ant.project.name : 当前执行的项目名称及信息。
java.version :Java的版本信息。
java.class.path :Java的根目录位置。
line.separator :换行符。
user.home :用户的home目录,在linux系统用到。
3, 指定执行某一项任务:ant -f bu.xml clean
任务:java执行类
<target name="execute" depends="init">
<javaclassname="com.wzj.test.feeMatch" classpath="build/classes">
<arg value="a"/> 增加命令行参数
<arg file="."/> 绝对的当前路径
</java> </target>
4, ant -p -f bu.xml
Main targets: 指的是包含description属性的为公有的.
Other targets :指的是没有包含description属性的私有任务。
5,文件集:fileset
<filesetdir="src" includes="**/*.java" id="source.fileset">
dir 是一个强制的属性,指定一个基文件夹,从这个基文件夹下的文件中查找。
includes 属性显示了基文件夹下的文件如何被包含,**/ 是递归包含。
id属性是一个引用,在之后可以通过引用来使用对应的文件集。
exclude 需要排除的文件。
<copy todir="backup"> //拷贝--会自动创建backup文件夹
<fileset refid="source.fileset"/> //引用文件集
</copy>
<copy todir="backup">
<fileset dir="lib">
<include name="**/*.jar"/> //默认情况,include和exclude值是区分大小写的
<exclude name="**/*.jsp"> //可以设置casesensitive="false"来取消大小写限制
</filesset>
</copy>
6,编译javac
debug="yes"产生所有调试信息; debug="no" 不产生任何的调试信息。
verbose="true" 输出编译器正在处理的任务
<classpath> 指定去什么地方查找对应的类文件和类库
<pathelement location="lib/some.jar"/>
<classpath>
<src path="src"/> 或者 srcdir="src" 指定去什么地方查找对应的输入的源文件
destdir="build/classes" 指定把产生的类文件放置到什么地方
eg:
<javac destdir="${build.classes.dir}" includeantruntime="true" failοnerrοr="true"
debug="${build.debug}"
srcdir="${src.dir}"> 使用属性名的方式引用源代码文件夹,可使用srcdir="src"比较
<include name="**/*.java"/>
<classpath refid="compile.classpath"/> 使用到文件集引用
</javac>
<path id="compile.classpath">
<pathelement location="${lu.jar}"/> 依赖的jar包
<pathelement location="${jt.jar}"/>这里的jt.jar是代表属性名称,而不是文件名
</path>
<path id="test.path">//依赖jar包,
<path refid="compile.classpath"/>
<pathelement location="${build.classes}"/>
</path>
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/some.jar"/>
</classpath>
location属性指定了一个单独的文件或文件夹。
path 属性可以接受冒号(colon)或分号分割的地址列表,这里指的是${classpath}的值。
也可以: <classpath location="lib/some.jar"/>
<classpath path="build/classes;lib/some.jar"> 分隔符 ;和:都可以
7,过滤器集 Filterset
使用标识符为at-字符(@) 例如:<body> System time :@DATE@ @TIME@ </body>
<tstamp/> //时间戳, 这也是一个任务:主要是在控制台显示当前时间
<copy todir="new_web" overwrite="true"> //overwrite="true"停用依赖检查
<fileset dir="web" includes="**/*.jsp"/>
<filterset>
<filter token="DATE" value="${DSTAMP}"/> //token指要替换的文本,value真正文本内容
<filter token="TIME" value="${TSTAMP}"/>
<filterset>
</copy>
说明:1),<tstamp> 任务创建了DSTAMP和TSTAMP这两个Ant属性。${DSTAMP}和${TSTAMP}各自包含了当前的由<tstamp>任务产生的日期戳和时间戳。
2),依赖检查:<copy>任务不会去拷贝还未过期的文件。但是带过滤的拷贝永远会去替换目标文件。因此,想要去停用这个依赖检查的话可以通过overwrite="true"
8,映射mapper
1),一致性映射(Identity mapper):目标文件和源文件的名字是一样的。
用法:<mapper type="identity">
默认情况下,<copy>任务使用的是identity映射。
2),扁平映射(Flatten mapper):目标文件和源文件的名字是一致的,但是要把原来的源文件的文件夹去除。用法:<mapper type="flatten"/>
示例:<copy todir="new_web">
<fileset dir="web" includes="**/*.jsp"/>
<mapper type="flatten"/> //将不同文件夹下的文件拷贝到同一个文件夹下。
</copy>
注意:所有拷贝的文件都必须拥有不同的名称。
3),合并映射(Merge mapper):目标文件名都是同一个,都是由to属性指定的那个。
用法:<mapper type="merge" to="archive.zip"/>
eg:<uptodate property="zip.notRequired">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="merge" to="../distzip/src.zip"/>
</uptodate> 注意这里映射到to属性是与secfiles元素当中嵌套的"dir"属性相对,而不是相对于基路径,这里是相对于src路径。
4),全局映射 (Glob mapper):在from模式中用一个星号指代的部分由to模式中的内容替代,只对匹配from模式的文件进行操作。
用法:<mapper type="glob" from="*.java" to="*.java.bak"/>
示例:<copy todir="srcback">
<fileset dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java" to="*.java.bak"/>
</copy>
所有的Java源文件都被拷贝到了srcback文件夹下,包含对应的文件夹层次中的也是,所有以.java结尾的文件都会被重命名为以.java.bak结尾。
示例二: <mapper type="glob" from="C*ies" to="Q*y"/> //星号*部分保持不变
eg:C.properties ---> Q.property
5),包映射(Package mapper)
用法:<mapper type="package" from="*Test.java" to="TEST-*TEST.xml"/>
eg: org/apache/tools/ant/util/PackageMapperTest.java
---> TEST-org.apache.tools.ant.util.PackageMapperTest.xml
它会去查找到的符合源代码规则的源代码上,把目录分隔符/在目标位置替换成.点
说明:package与<uptodae>和<Junit>一起使用时尤其好用。
6),解包映射(Unpackage mapper)
用法:<mapper type="unpackage" from="TEST-*Test.xml" to="${test.src.dir}/*Test.java">
eg: TEST-org.acme.AcmeTest.xml ---> ${test.src.dir}/org/acme/AcmeTest.java
说明:unpackage映射是package映射的一个反向。
把包声明中的点.用文件夹分隔符/来替换。
9,内置属性
basedir : 默认指向当前构建文件的路径
ant.home : 正在执行的ant根目录
ant.file : 构建文件的绝对路径
ant.version : Ant版本
ant.java.vesion : Ant发现的JVM版本,支持1.1--1.5版本
ant.project.name : 当前运行的项目的名字,是通过<project>元素的name属性进行设置的。
user.name :
user.home :
java.home :
10,property任务设置属性:可放置在<target>内也可放在外
与绝对路径绑定使用location:如果我们想让 build/ptput被理解为一个绝对的路径,应使用name和location属性来代替name和value属性。
<property file="build.properties"/> //从属性文件中加载属性,与build.xml同一文件夹下。
注意:从属性文件中读取的所有的属性都会默认被看作死value而不是location
命令行为属性赋值: -Dwho=wzj 覆盖属性。
相同的属性名称不同的属性值,可以使用前缀。
示例:属性文件中有build.debug属性。
<property file="build.properties" prefix="tmp"/>
<echo message="tmp.build.debug="${tmp.build.debug}"/>
<echo message="build.debug="${build.debug}"/>
</property>
加载环境变量作为属性:
<property environment="env"/> //读取环境变量以"env"作为前缀。
${env.Path} ${env.ANT_HOME}
11,属性不变性的例外:例外情况的存在大部分的原因是出于对逻辑合理性的考虑。
<ant>
<antcall>
<available>
12,available任务,修改属性的值
<available>:检查一个文件或一个文件夹是否存在。
<available file="./dist/propject.jar" type="file" property="isExist"> 如果文件存在,isExist会被设置为true.
eg:<available classname="com.mysql.jdbc.Driver" classpath="dist/mysql.jar" property="MainClass.in.jar"/>
<echo>com.mysql.jdbc.Driver in jar is ${MainClass.in.jar}</echo>
说明:如果Driver类在mysql.jar中存在,则属性(MainClass.in.jar)会被设置为true。
eg:检查JVM系统资源的存在性。
<available resource="project.jar" property="project_jar">
<classpath>
<pathelement location="dist"/>
</classpath>
</available>
说明:如果资源文件project.jar在文件夹dist中被发现的话,上面的代码设置project_jar属性为"true"
13,uptodae任务设置一个属性
<uptodate property="tests.unnecessary" value="OF COURSE!">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java" to ="../build/classes/*.class"/>
<uptodate> 如果源文件与编译后的class文件一致,property将被设置为true ,文件未过时返回true
注意:这里mapper的"to"属性相对的是srcfiles元素中嵌套的dir属性的根目录,而不是指向项目的基路径。
14,condition任务来进行条件判断,可修改属性
<condition> 任务是在某一个判断条件为true的时候设置一个属性
允许嵌套的条件:<available> <uptodate><os><equals><isset>
eg:<condition property=""isMac>
<and>
<os family="mac"/>
<not> <os family="unix"/> </not>
</and> </conditionS>
说明:如果当前操作系统是Mac,并且不是uunix家族的话,设置isMac属性值为true.
15,<tstamp>创建一个构建时间戳
DSRAMP "YYYYMMDD"
TSTAMP "HHMM"
TODAY "MONTH DAY YEA"
用法:<tstamp/> 会自动设置基于当前日期/时间设置。
<tstamp>
<format property="builtime" pattern="yyyy-MM-dd 'T'HH:mm:ss"/> //2016-11-05T12:10:12
<format property="dayofweek" pattern="EEEE"/>
</tstamp>
<echo message="${DSTAMP}"> ${TSTAMP} ${TODAY} ${dayofweek} ${buildtime}
说明:E的含义是每周的第几天("day of week");
EEEE意思是长格式:Monday, EEE意思是短格式:Mon
16,条件判断if/unless,他判断的是属性是否存在,并不判断值是多少。
if当属性值存在的时候运行。与设置的值是什么无关。只验证存在性。
unless是指在属性没有被设置的时候才运行。
<property name="module-A" value="yes"/>
<target name="build_A" if="module-A"/>//如果"module-A"被设置值,将会执行任务。
注意在if中设置module-A时,不应该使用${..},直接使用属性name,并非属性值${..}。
查看jar包的内容:使用命令:jar tf out.jar 或 jar tvf out.jar
17,fail任务将构建终止,失败
<fail>任务是强制让一个构建过程失败。
<fail message="构建失败!" unless="属性名称"/> 如果属性未被赋值,则执行,这里是执行终止构建。
18,引用/关联,通过refid属性来引用id
<path id="compile.classpath">
<pathelement location="${lu.jar}"/>
<pathelement lication="${dy.jar}"/>
</path>
其他地方引用:<path refid="compile.classpath"/>
refid和id属性对所有的数据类型都是可用的,
这些数据类型包括path,fileset,patternset,filterset,mapper.
19,嵌套构建:<ant>任务
构建文件的名字通过使用"antfile"属性,或者仅仅通过使用"dir"属性指定一个文件夹,文件夹中包含build.xml文件,Ant构建文件中的一个可以调用执行的特定的目标否则的话默认的目标将会执行。
在发出调用请求的构建文件中设置的所有的属性都是可以在嵌套的构建文件中使用的。
但是在<ant>任务中设置的一个属性仅仅可以在被调用的文件中使用。
eg:在当前的文件中调用另一个构建文件,并传递一个参数。
<ant antfile="./hello/some-build.xml">
<property name="production" value="true"/> //这个属性传递到some-build.xml中,其他构建文件都不能使用,包括主构建文件也不能使用。
</ant>
不指定构建文件的名字,我们可以仅仅指定一个子项目的构建文件夹,默认构建文件名称build.xml。
<ant dir="./hello"/>
指定构建文件中要运行那个目标任务。
<ant antfile="./hello/some-build.xml" target="run"/>//点.代表根目录:./hello/h/build.xml
20, 打包jar任务
<target name="jar" depends="compile">
<jar destfile="build/dist/hello.jsp" basedir="build/classes">
<manifest>
<attribute name="Main-Class" value="com.wzj.test.HellloWorld"/> //指定jar中直接执行那个main方法,需要写入到META-INF/MANIFEST.MF中
<attribute name="Build-By" values="wangzj"/>
</manifest>
</jar>
</target>
21单元测试Junit
<target name="run-test" depends="compile-test">
<junit printsummary="true" haltonfailure="true">// 打印摘要信息,测试失败终止执行
<classpath refid="run-test-path"/>
<formatter type="brief" usefile="false"/>
<test name="${run.test.class}"/>//单个测试
<formatter type="xml"/>//测试报告格式化为xml格式
<batchtest todir="${build.test.report}">//测试报告生成目录
<fileset dir="${build.test.classes}" includes="test*.class"/>//批量测试
<report format="frames" todir="${}/html">
</batchtest>
</junit>
<junitreport todir="${dir}">//对测试报告打包为html文件可用浏览器查看
<fileset dir="${dir}" includes="TEST-*.xml"></fileset>
<report format="frames" todir="${dir}/html">
</target>
22生成javaAPI文档
<javadoc sourcepath="${src.dir}" private="true" windowtitle="我的JAVA DOC" user="true"
packagenames="cn.*" destdir="${build.doc}" charset="UTF-8" docencoding="UTF-8" encoding="UTF-8">
<classpath path="${build.classes}"></classpath>
</javadoc>
23打zip包
<zip destfile="${zip.dir}/${zip.name}" duplicae="preserve">
<zipfileset dir="${build.doc}" includes="**/*.*" prefix="${project.name}/doc/api"/>
<zipfileset dir="${src.dir}" includes="**/*.*" prefix="${project.name}/src"/>
</zip>
24 FTP上传
依赖 commons-net-3.1.jar包
<ftp userid="" password="" server="localhost" action="mkdir" remotedir="user">//在ftp服务上创建user文件夹
</ftp>
<ftp userid="" password="" server="localhost" action="put" remotedir="user"> //上传文件的操作
<fileset dir="${zip.dir}" includes="*.zip"/>
</ftp>
25,bulid.xml实例
<?xml version="1.0"?>
<project name="java" default="jar" basedir=".">
<property name="src" value="${basedir}/src/main/java" />
<property name="target" value="${basedir}/target" />
<property name="source.encoding" value="utf-8" />
<property name="source.version" value="1.6" />
<property name="class.version" value="1.6" />
<dirname property="batch.basedir" file="${ant.file.included}"/>
<property file="${batch.basedir}/../wl_home.properties" />
<path id="classpath">
<fileset dir="${basedir}/../fee_ear/EarContent/APP-INF/lib">
<include name="**/*" />
</fileset>
<pathelement location="${wl_home}/server/lib/weblogic.jar" />
<pathelement path="${basedir}/../fee_build/EarContent/APP-INF/classes" />
</path>
<target name="init" description="初始化">
<mkdir dir="${target}/classes" />
</target>
<target name="compile" depends="init" description="编译 java 处理源代码">
<javac fork="true" debuglevel="lines,vars,source" includeantruntime="false" source="${source.version}" target="${class.version}" encoding="${source.encoding}" debug="on" srcdir="${src}" destdir="${target}/classes" classpathref="classpath">
</javac>
</target>
<target name="jar" depends="compile" description="打 java 处理的 jar 包">
<copy todir="${target}/classes">
<fileset dir="${basedir}/src/main/resources">
<include name="**/*" />
</fileset>
</copy>
<jar destfile="${target}/tech-java.jar" basedir="${target}/classes" >
<fileset dir="${basedir}">
<Include name="META-INF/" />
</fileset>
</jar>
</target>
<target name="dist" depends="jar" description="打 java 处理的发布包">
</target>
<target name="pre-prod" depends="init" description="准备生产相关的配置文件">
<copy todir="${target}/classes" overwrite="true">
<fileset dir="${basedir}/src/product/resources" includes="cebfee/*" />
</copy>
<copy file="${basedir}/src/product/resources/ehcache${appid}.xml" tofile="${target}/classes/ehcache.xml" overwrite="true" />
<copy file="${basedir}/src/product/resources/ecif_msg${appid}.properties" tofile="${target}/classes/ecif_msg.properties" overwrite="true" />
<copy file="${basedir}/src/product/resources/app_msg${appid}.properties" tofile="${target}/classes/app_msg.properties" overwrite="true" />
<copy file="${basedir}/src/product/resources/clientConfig${appid}.properties" tofile="${target}/classes/clientConfig.properties" overwrite="true" />
</target>
<target name="clean" description="清理临时目录">
<delete dir="${target}" />
</target>
</project>