Ant(蚂蚁搬家)
Posted 夏小弥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ant(蚂蚁搬家)相关的知识,希望对你有一定的参考价值。
Ant
什么是Ant
Ant是一个构建工具,是一个小程序。但是它通过自动完成所有的编译代码,运行测试以及打包重新部署的结果等繁琐费力的任务来帮助软件团队开发大程序.
Ant 使用Java编写,跨平台,易使用且可伸缩。既可以用在小型个人项目中,也可以用于大型多团队软件项目。
Ant的目标是自动完成所有的构建过程。
Ant的核心概念
构建文件:-build.xml
Ant使用称之为构建文件的xml文件来描述如何构建工程,在这个文件里,开发者列出各种构建目标(target)以及达到这些目标的任务(task)。
一个构建文件包含一个项目-project <project>
每个项目包含多个目标 – target //每个target为一个大任务
目标依赖于其他目标 – depends //大任务可以依赖于其他大任务,助理解:extends也有类似的依赖关系
目标包含任务 – javac,java,jar,war,copy,mkdir,delete,sql…//小任务
由任务完成所有工作。
准备工作
下载:
http://ant.apache.org/
配置环境变量:
ANT_HOME
PATH
验证Ant是否正常:
命令行输入 ant -version
QUICK-START:
1.新建空文件夹
2.新建一个Java文件
3,编写build.xml
4,运行ant
第一个示例:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="main" name="first">
<target name="main">
<!--编译本目录下的源文件-->
<javac srcdir="." includeAntRuntime="yes" destdir="."/>
<echo>Ok</echo>
</target>
</project>
所有构建文件都要有<project>元素,而且至少有一个<target> 元素。
对于<project> 元素的default 属性并没有默认值。
构建文件并不一定要被命名为build.xml。不过build.xml 是Ant 要搜索的默认文件名。
每个构建文件只能有一个<project> 元素
Ant任务(task)
一个task是一段可执行的代码。
一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。
下面是Task的一般构造形式:
<taskname attribute1="value1" attribute2="value2" ... />
这里taskname是task的名字,attributeN是属性名,valueN是属性值。
有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。
所有的task都有一个task名字属性。Ant用属性值来产生日志信息。
Ant核心任务之copy
1.拷贝单个的文件:
<copy file="myfile.txt" tofile="mycopy.txt"/>
2.拷贝单个的文件到指定目录下
<copy file="myfile.txt" todir="../some/other/dir"/>
3.拷贝一个目录到另外一个目录下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
4.拷贝一批文件到指定目录下
<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><pre name="code" class="java">5.拷贝一批文件到指定目录下,将文件名后增加。Bak后缀
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<mapper type="glob" from="*" to="*.bak"/>
</copy>
6.拷贝一组文件到指定目录下,替换其中的@标签@内容
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<filterset>
<filter token="TITLE" value="Foo Bar"/>
</filterset>
</copy>
Ant核心任务之delete
删除一个(组)文件或者目录,例子:
1.删除一个文件
<delete file="/lib/ant.jar"/>
2.删除指定目录及其子目录
<delete dir="lib"/>
3.删除指定的一组文件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
4.删除指定目录及其子目录,包括他自己
<delete includeEmptyDirs="true">
<fileset dir="build"/>
</delete>
Ant核心任务move
Move:移动或重命名一个(组)文件、目录,例子:
1.移动或重命名一个文件
<move file="file.orig" tofile="file.moved"/>
2.移动或重命名一个文件到另一个文件夹下面
<move file="file.orig" todir="dir/to/move/to"/>
3.将一个目录移到另外一个目录下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4.将一组文件移动到另外的目录下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5.移动文件过程中增加。Bak后缀
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>
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“ />
编译src和src2目录及其子目录下的所有。Java文件,但是package/p1/**,mypackage/p2/**将被编译,而mypackage/p1/testpackage/**将不会被编译。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息
3.<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="src“ destdir="src“ classpath="classpath“ debug="on"/>
路径是在property中定义的
Ant核心任务之java
java执行指定的java类,例子:
1.<java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="java.class.path"/>
</classpath>
</java>
classname中指定要执行的类,classpath设定要使用的环境变量
2.<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="java.class.path/"/>
<pathelement path="additional.path"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
Ant核心任务之jar
jar将一组文件打包,例子:
1.<jar destfile="dist/lib/app.jar" basedir="build/classes"/>
将build/classes下面的所有文件打包到dist/lib/app.jar中
2.<jar destfile="dist/lib/app.jar"
basedir="build/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
将build/classes下面的所有文件打包到dist/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
3.<jar destfile="dist/lib/app.jar"
basedir="build/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
manifest="my.mf"
/>
manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成
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
以上是关于Ant(蚂蚁搬家)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&&bzoj1630[Usaco2007 Demo]Ant Counting*