Study report of Ant
实训学习的Ant笔记,基本上是个入门简陋的版本,要是想要认真学习的话还是推荐去找文档学习
Ant
简介
Ant是一个类似于makefile一样的东西,自动编译什么的,一个大项目还是非常需要的,如果要认真掌握的话和makefile差不多,也是要多多练习。
入门
先新建一个build.xml文件
<?xml version="1.0"?>
<project name="helloWorld">
<target name="sayHelloWorld">
<echo message="Hello,Amigo"/>
</target>
</project>
然后可以运行$ ant sayHelloWorld
屏幕上会打印
$ ant sayHelloWorld
Buildfile: build.xml
sayHelloWorld:
[echo] Hello,Amigo
BUILD SUCCESSFUL
Total time: 0 seconds
刚开始下载的是1.5版本,系统提示缺少什么东西,换成1.7版本就好了
把这个build.xml改个名字就GG了,因为ant命令会缺省的寻找build.xml文件,如果文件名是别的什么hello.xml的话,要主动地告诉ant我们要用什么文件
$ ant –f hello.xml sayHelloWorld
$ ant –buildfile hello.xml sayHelloWorld
$ ant –file hello.xml sayHelloWorld
解释
project
是ant文件的根元素,可以包含多个target
元素
使用ant -projecthelp
指令可以输出所有target
的名称
属性名称 | 说明 |
---|---|
name 属性 | 指定project 元素的名称 |
default 属性 | 指定project 默认执行的target 的名称 |
basedir 属性 | 指定基路径的位置,或者缺省的使用Ant构建文件的父目录 |
target
是基本执行单元,可以包含具体的任务,多个target
之间可以相互依赖
属性名称 | 说明 |
---|---|
name 属性 | 指定名称 |
depends 属性 | 描述target 之间的依赖关系,会按照depends 中的target 的出现顺序依次执行每个target 。 |
if 属性 | 验证指定的属性是否存在,不存在就不执行target |
unless 属性 | 和if 相反,若存在就不执行 |
看个例子
<?xml version="1.0"?>
<project name="targetStudy">
<target name="targetA" if="ant.java.version">
<echo message="Java Version: ${ant.java.version}"/>
</target>
<target name="targetB" depends="targetA" unless="amigo">
<description>
a depend example!
</description>
<echo message="The base dir is: ${basedir}"/>
</target>
</project>
targetA
说如果ant.java.version
属性存在那么才执行targetB
要依赖于targetA
,并且要求amigo
不存在${}
可以作为变量,这和makefile是类似的
property
参数的定义
若要引入外部定义的名为build.property的文件,可以用<property file="build.properties"/>
。
也可以<property name="" value=""/>
定义,类似makefile的变量,定义以后可以用${name}
来获取value
。
常用任务
复制文件
话不多说上代码就看明白了
<!-- 复制单个文件 -->
<copy file="file.txt" tofile="copy.txt" />
<!--对文件目录进行复制-->
<copy todir="../newdir/dest_dir">
<fileset dir="src_dir"/>
</copy>
<!-- 将文件复制到另外的目录 -->
<copy file="file.txt" todir="../other/dir"/>
删除
<!-- 删除某个文件: -->
<delete file="photo/amigo.jpg"/>
<!-- Eg2. 删除某个目录:--> <delete dir="photo"/>
<!-- Eg3. 删除所有的备份目录或空目录:-->
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
mkdir
<mkdir dir="build"/>
move
<!-- Eg1. 移动单个文件: -->
<move file="fromfile" tofile=”tofile”/>
<!-- Eg2. 移动单个文件到另一个目录: --> <move file="fromfile" todir=”
movedir”/>
<!-- Eg3. 移动某个目录到另一个目录: -->
<move todir="newdir">
<fileset dir="olddir"/>
</move>
利用ant部署Java项目
先建立一个叫antStudy的Java项目,src为源代码目录,新建HelloWorld.java类
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,Amigo");
}
}
在根目录建立build.xml
<?xml version="1.0"?>
<project name="javaTest" default="jar" basedir=".">
<target name="clean">
<delete dir="build"/>
</target>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/>
</target>
<target name="run" depends="compile">
<java classname="HelloWorld">
<classpath>
<pathelement path="build/classes"/>
</classpath>
</java>
</target>
<target name="jar" depends="run">
<jar destfile="helloworld.jar" basedir="build/classes">
<manifest>
<attribute name="Main-class" value="HelloWorld"/>
</manifest>
</jar>
</target>
</project>
第4行的target清空了build的整个目录
7行重新建立build目录和classes目录
8行运行javac编译
11行运行java程序
18行jar打包
根据依赖关系可以一步一步上溯,最终执行还是从上到下的target一次执行的。
$ ant
Buildfile: build.xml
clean:
[delete] Deleting directory D:\Mycode\SE_Java\antStudy\build
compile:
[mkdir] Created dir: D:\Mycode\SE_Java\antStudy\build\classes
[javac] Compiling 1 source file to D:\Mycode\SE_Java\antStudy\build\classes
run:
[java] Hello,Amigo
jar:
[jar] Building jar: D:\Mycode\SE_Java\antStudy\helloworld.jar
BUILD SUCCESSFUL
Total time: 1 second
可以看一下目录结构
D:.
├─build.xml
├─helloworld.jar
├─src
│ └─HelloWorld.java
└─build
└─classes
└─HelloWorld.class
打war包
<target name="war" depends="compile">
<war destfile="${build}/antwebproject.war" webxml="WebRoot/WEB-INF/web.xml">
<!-- 拷贝 WebRoot 下除了 WEB-INF 和 META-INF 的两个文
件夹-->
<fileset dir="WebRoot" includes="**/*.jsp"/>
<!-- 拷贝 lib 目录下的 jar 包-->
<lib dir="${lib}"/>
<!-- 拷贝 build/classes 下的 class 文件-->
<classesdir="${classes}"/>
</war>
</target>
暂时还用不到web应用也没有仔细看,大概就是用<war>
指令指定file和lib、classes打包