Ant是一种基于Java(跨平台)的打包工具,它能实现项目的自动构建和部署等功能。
一、ant常用元素介绍:
该元素项目的顶级元素,一个build.xml文件至少应该包含一个project元素。属性如下:
name:该project节点名称
default:默认执行的target元素节点名称
basedir:用于指定基路径的位置。项目根节点,一般为“.”。
例子:定义project文件的文件名为antproject,默认执行的target名称为jar
<project name="antproject" basedir="." default="jar"></project>
name:常量名称
value:常量值
location:同value类似。
file:定义引入的配置文件
例子:引入配置文件build.properties,定义srcDir常量对应的值为src,buildDir常量对应的值为build
<property file="build.properties" />
<property name="srcDir" location="src" />
<property name="buildDir" value="build" />
注:另外Ant提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径
ant.version:Ant的版本
ant.project.name:当前指定的project的名字
ant.java.version:Ant检测到的JDK的版本
该元素用于定义需要执行的任务,即从对应target开始执行需要的任务。同一个project下可包含多个target节点。主要属性:
name:该任务的名称,project元素中的default就是填写此处的name
depends:可选,指定target的依赖关系,即开始执行该target时要先执行的target。
if:用于判断后面描述的属性是否存在,存在才会执行该target
unless:与if相反,之后描述的属性不存在才执行该target
description:对target进行说明
<target name="compile" depends="init" if="srcDir">
<description>im a description message</description>
<javac srcdir="${srcDir}" destdir="${buildDir}">
</javac>
</target>
4、fileset元素
一般配合include和exclude来描述一个目录中需要的文件以及过滤的文件。主要属性:
dir:指定源文件路径
include:描述fileset包含源文件路径下哪些文件
exclude:描述fileset不包含源文件路径下哪些文件
例子:选择当前路径下所有.jar结尾的文件
<fileset dir=".">
<include name="*.jar" />
</fileset>
5、mkdir元素
该元素用于创建文件夹,主要属性:
dir:需要创建的目录
例子:创建一个classes目录
<target name="init">
<mkdir dir="classes" />
</target>
例子:
删除index.jsp文件:
<delete file="index.jsp" />
删除classes目录:
<delete dir="classes" />
删除所有的备份目录或空目录:
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
file:源文件
todir:复制的目标路径
tofile:复制的目标文件
例子:
复制单个文件:
<copy file="file.txt" tofile="copy.txt"/>
对文件目录进行复制:
<copy todir="newdir">
<fileset dir="classes"/>
</copy>
将文件复制到另外的目录:
<copy file="file.txt" todir="classes"/>
该元素用于移动文件,主要属性:
file:源文件
todir:复制的目标路径
tofile:复制的目标文件
例子:
移动单个文件为newfile文件:
<move file="fromfile" tofile="newfile"/>
移动单个文件到bin目录:
<move file="fromfile" todir="bin"/>
移动olddir目录到newdir目录:
<move todir="newdir">
<fileset dir="olddir"/>
</move>
9、echo元素
该元素的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下:
<echo message="Hello,Amigo" file="logs/system.log" append="true">
10、Javac元素
该元素用于编译Java源文件,其主要属性:
srcdir:表示源文件位置
destdir:编译后文件存放位置
encoding:指定编码格式
classpath:指定lib位置
debug:是否输出调试信息,为boolean值
例子:
<target name="compile" depends="init">
<mkdir dir="build" />
<javac debug="true"
destdir="build"
deprecation="javac the src"
source="1.8" target="1.8" encoding="UTF-8">
<src path="src" />
</javac>
</target>
11、jar元素
该元素用于将指定文件或文件夹的内容进行打包,打jar包,主要属性:
jarfile:指定生产jar文件路径及名称
basedir:指定源文件位置
其下有一个子节点manifest,用于指定最后生成jar包中manifest.mf文件的内容
如下指定jar包的主方法(入口): <property name=”Main-Class”value=“xxxx.xxx.xxx.Xxxx”/>
例子:
<target name="jar">
<jar destfile="test/package.jar" basedir="build">
<!-- 创建清单 user.name 为计算机当前登录用户名-->
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="test.First" />
</manifest>
</jar>
<jar destfile="test/package-src.jar" basedir="src" />
</target>
<target name="war" depends="compile">
<war destfile="warpath" webxml="WebContent/WEB-INF/web.xml" basedir=".">
</war>
</target>
13、zip元素
该元素用于将指定文件打成一个zip包,属性如下:
destfile:打包之后文件存放位置
<target name="zip" >
<zip destfile="zippath" basedir="."></zip>
</target>
二、实例
1、在eclipse构建一个java项目,其中src中用于放项目源码,在src下构建一个test包,然后新建一个First.java类,内容如下:
2、编写build.properties配置文件如下:
3、编写build.xml文件的内容,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--定义project文件的文件名与默认执行目标-->
<project name="antproject" basedir="." default="jar">
<!--添加描述-->
<description>A simple Java project</description>
<!--添加属性,相当于文件级的全局变量-->
<property file="build.properties" />
<property name="srcDir" value="src" />
<property name="buildDir" value="build" />
<property name="distDir" value="dist" />
<property name="debug" value="true" />
<property name="jarpath" location="./build/jar"/>
<property name="warpath" location="./build/war"/>
<property name="zippath" location="./build/zip"/>
<property name="javadoc" location="./build/doc"/>
<!-- 如果有额外的jar包,可以再这里指定,再下面的classpath处进行引用
<path id="classpath">
<pathelement path="your jar jar file path"/>
</path>
定义之后在javac中添加,可看后面的javac中的注释-->
<!--创建目标clean,用于清空build与dist目录-->
<target name="clean" if="ant.java.version">
<delete dir="${buildDir}" />
<delete dir="${distDir}" />
<!--用于打印输出-->
<echo message="version is ${ant.java.version}"></echo>
</target>
<!--初始化,创建文件夹,用于放置操作之后的文件-->
<target name="init">
<mkdir dir="${buildDir}" />
<mkdir dir="${distDir}" />
<mkdir dir="${jarpath}"/>
<mkdir dir="${warpath}"/>
<mkdir dir="${zippath}"/>
<mkdir dir="${javadoc}"/>
</target>
<!--编译,srcdir指明源文件目录,destdir指编译好后放在哪里。-->
<!--denpends="init" 表示要先运行init这个target-->
<target name="compile" depends="init">
<javac srcdir="${srcDir}" destdir="${buildDir}">
<!--
<classpath refid="classpath"/>
-->
</javac>
</target>
<!-- 生成javadoc文档 -->
<target name="javadoc" depends="init">
<javadoc sourcepath="${srcDir}" destdir="${javadoc}" encoding="utf-8" charset="gb2312">
</javadoc>
</target>
<!--运行命令其实就是Java的命令。这里指明要运行的类为test包下的First类,classpath指出编译文件位置-->
<target name="run" depends="compile">
<java classname="test.First" classpath="${buildDir}" />
</target>
<!-- buildDir常量不存在时执行该target打印信息 -->
<target name="testunless" unless="buildDir">
<echo message="test the unless"></echo>
</target>
<!--将build文件夹下的.class编译文件打成jar包之后放到dist,命名为package.jar;将src中的源码达成名字为package-src.jar的jar包-->
<target name="jar" depends="compile">
<jar destfile="${distDir}/package.jar" basedir="${buildDir}">
<!-- 创建清单 , user.name 为计算机当前登录用户名-->
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="test.First" />
</manifest>
</jar>
<jar destfile="${distDir}/package-src.jar" basedir="${srcDir}" />
</target>
<!-- 打war包 ,因为不是web工程,没有WEB-INFO/web.xml文件,添加属性needxmlfile=false即可 -->
<target name="war" depends="compile">
<war destfile="${warpath}" basedir="${buildDir}" needxmlfile="false"></war>
</target>
<!--
<target name="war1" depends="compile">
<war destfile="${warpath}" webxml="WebContent/WEB-INF/web.xml">
拷贝webroot下除了web-inf和meta-inf的两个文件夹
<fileset dir="WebContent" includes="**/*.jsp" />
拷贝lib下的jar
<lib dir="${lib}" />
拷贝build/classes下的.class文件
<classes dir="${classes}" />
</war>
</target>
-->
<!-- 将整个工程打成一个zip压缩包 -->
<target name="zip" depends="javadoc,jar,war">
<zip destfile="${zippath}" basedir="."></zip>
</target>
</project>
4.执行打包方式:
(1)可以在控制台进入对应项目目录,然后使用 ant+target名 的方式执行对应的target任务,如果只是执行ant命令则默认会执行project中default对应的target
(2)在eclipse上 window -> show view -> ant 调出ant的窗口,然后就可以选择对应的target进行执行
执行完对应的任务,刷新项目则可看到生成的包