ANT环境变量设置
说明:--->配置ANT环境变量前,还须配置JAVA的环境变量.
JAVA_HOME=....
PATH=%JAVA_HOME%\bin;
CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;
 
Windows下ANT用到的环境变量主要有2个,ANT_HOME 、PATH。
设置ANT_HOME指向ant的安装目录。
设置方法:
ANT_HOME = D:\apache_ant_1.7.0 (如此例)
将%ANT_HOME%\bin; %ANT_HOME%\lib添加到环境变量的path中。
设置方法:
PATH = %ANT_HOME%\bin; %ANT_HOME%\lib
1.2 ANT用法:
ant
使用当前目录下的build.xml运行Ant,执行缺省的target。
ant clean
若要执行build.xml中某个target:clean
ant -buildfile test.xml
使用当前目录下的test.xml运行Ant,执行缺省的target。
ant -buildfile test.xml compile
使用当前目录下的test.xml运行Ant,执行一个叫做compile的target。
(2)
eclipse中ANT的使用
若在eclipse中使用ant,则都不用下载ant包.eclipse已自带支持ANT了.具体配置如下:
1.新建Java Project-新建Java文件HelloWorld.java
HelloWorld.java
package example;
public class HelloWorld {
    public static void main(String[] args) {
       System.out.println("Hello World");
    }
}

    2.在工程根目录下新建build.xml
build.xml
<?xml version="1.0" encoding="utf-8"?>
<project default="main" basedir=".">
    <target name="main" depends="compile, compress" description="Main target">
       <echo>Building the .jar file.</echo>
    </target>
    <target name="compile" description="Compilation target">
       <javac srcdir="${basedir}/src/example" />
    </target>
    <target name="compress" description="Compression target">
       <jar jarfile="HelloWorld.jar" basedir="${basedir}/src/example" includes="*.class" />
    </target>
</project>
    此脚本文件内容是编译/src/example下的java文件,并就地生成class文件,将这个class文件打成jar包,HelloWorld.jar。
    此时工程的目录结构如下图所示:
    ant 入门教程_职场
    如何在eclipse中应用build.xml:
1.先打开ant视图:
   windows-->show view-->other-->ant.会打开ant视图。
2.只须将左边视图的build.xml拉动ant视图中即可显示所有target。若要运行其中某个target,只须双击目标target即可。
如下图:
在<project>中定义的name,会显示在ant视图中的项目名;定义的default,会在ant视力中显示为蓝色标记
ant 入门教程_职场_02
(3)
关于ant的设计:
在build.xml中定义的各target,尽量是独立的,不要存在依赖,因为这样方便各target的独立调试。若存在依赖,则会先执行各依赖的target,放慢调试的速度。只有一定要存在依赖时,才加。
在部署时,才一起加上去。
如:
在ant中包含打包及findBugs,pmd,checkStyle,其设计可以是:
1.
findBugs,pmd,checkStyle任务,保持不依赖,方便各调试(它们跟代码的编译,打包无关),如:
<target name="findbug">...</target>
<target name="pmd">...</target>
<target name="checkStyle">...</target>
2.
在部署时,全部加上:
<target name="deploy" depends="zip,findbug,pmd,checkstyle"></target>
这样,即可以在部署时,执行编译,打包及代码检查。
注意:
depends存在多个依赖时,用“,”分开。执行顺序是:从左到右。
 
(4)
实例一:
项目结构:
antDemo
     src
            test1
     WEB-INF
            classes
     build.xml
在此项目结构中,有源/目的文件夹,以及ANT的配置文件.
 
重要:
default=run的意思是,ant启动时执行此个target.在执行这个target之前,会查找是否有depends,如果有,会先执行它。

一.build.xml
<?xml version="1.0"?>
<project name="project" default="run" basedir=".">
<target name="compile">
<javac destdir="WEB-INF/classes" srcdir="src"></javac>
</target>
<target name="run" depends="compile">
<java classname="test1.Hello" classpath="WEB-INF/classes"></java>
</target>
</project>
            
二.Hello.java    
package test1;
public class Hello{
public static void main(String[] arg){
    System.out.println("hello world!!!!!!");
}
}
三,
运行ANT时,要先进入此项目的根目录,(因为build.xml就放在项目的根目录);
然后在DOS命令行输入ant 就可以了.
***************
改进后的代码:
<?xml version="1.0"?>
<!--
重要:
default=run的意思是,ant启动时执行此个target.在执行这个target之前,会查找是否有depends,如果有,会先执行它。
-->
<project name="jasonTest" default="jar" basedir=".">
 <target name="usage">
  <echo message="****************** jason's constructions**************" />
  <echo message="在XML中,所有的标签必须是闭合的使用property,javac,java时,最后须加 / ;" />
  <echo message="depends,不要写成despends;" />
  <echo message="即使是属性,在引用时,也要加双引号;" />
  <echo message="java命令中,用classpath,非basedir." />
  <echo message="****************** jason's constructions**************" />
 </target>
 <target name="init" depends="usage">
  <tstamp />
  <property name="src" value="src" />
  <property name="dest" value="WebRoot/WEB-INF/classes" />
  <property name="classname" value="test1.Hello" />
 </target>
 <target name="compile" depends="init">
  <!-- ${src}:即是默认当前目录下的所有对象 -->
  <javac destdir="${dest}" srcdir="${src}" />
 </target>
 <target name="run" depends="compile">
  <!--设置classname,classpath时须注意:classname=test1.Hello classpath="WEB-INF/classes,而不是classname=Hello classpath="WEB-INF/classes/test1"-->
  <java classname="${classname}" classpath="${dest}" />
 </target>
 <target name="jar" depends="run">
  <mkdir dir="jars"/>
  <jar jarfile="./jars/jason-${DSTAMP}.jar" basedir="${dest}" />
  <copy todir="jars2">
   <fileset dir="jars">
       <include name="**/*.jar"/> 
   </fileset>
  </copy> 
        <delete dir="jars"/>

 </target>
 <!-- 打包WAR可用:  -->
 <target name="war" depends="run">
  <war destfile="./jason${DSTAMP}.war" webxml="WEB-INF/web.xml">
   <fileset dir="WebRoot" />
   <lib dir="WEB-INF/lib" />
   <classes dir="WEB-INF/classes" />
  </war>
 </target>
</project>
 
(4)
 
实例二:
(位于tomcat/webapps/jasonAnt)
项目结构:
jason
     src
            test1
     WEB-INF
            classes
            lib
            web.xml
     WebRoot
            test.jsp    
            ..
     build.xml

关键的build.xml的配置:
分三部分:
第一部分:init
一般的WEB应用程序的结构如上,所以在init时,一般可设置5个property,分别是:
<target name="init">
<property name="webroot" value="WebRoot"/>
<property name="src.dir" value="src"/>
<property name="dest.dir" value="WEB-INF/classes"/>
<property name="lib.dir" value="WEB-INF/lib"/>
<property name="webxml.dir" value="WEB-INF/web.xml"/>
</target>

第二部分是编译:
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${dest.dir}"/>
</target>

第三部分是WAR打包:
设置WAR打包时,须设置生成的包位置及名;指定web.xml;指定JSP文件;指定lib;指定classes
<target name="war" depends="compile">
<war destfile="./jason.war" webxml="${webxml.dir}">

<fileset dir="${webroot}">
<!--
若采用<fileset dir="${webroot}"/>则为默认方式:即加载此目录下的所有东西,包括子目录.
若<fileset></fileset>之前添加<include>,则只添加符合的条件的文件;exculde,则除外条件的文件.
<include name="*.jsp"/>
<include name="**/*.jsp"/>
的区别是:*.jsp:针对当前目录下的文件;**/
*.jsp:针对当前目录以及所有子目录(用**表示)下的所有JSP.
<exclude name="**/*.jsp"/>
-->
</fileset>

<lib dir="${lib.dir}"/>
<classes dir="${dest.dir}"/>
</war>
</target>

打包后的结构: -->important
对于文件夹:
原来根目录下的src文件夹,WebRoot文件夹,将会消失,WEB-IFN文件夹仍保留,会产生一个新的META-INF文件夹.
对于文件:
同时build.xml文件,也会消失;WebRoot文件夹中的JSP文件会解压到根目录下.

如何在TOMCAT上发布:
只须将此jason.WAR包放到tomcat/webapps/目录下,启动SERVER后,TOMCAT会自动解压生成一个相应的文件夹.
在地址栏中输入:http://localhost:8088/jason/test.jsp即可访问.
 
(5)
 
ANT的关键元素
3.1 Projects
Ant的buildfile是用XML写的。每个buildfile含有一个project。
project有下面的属性:
name 项目名称;
default 当没有指定target时使用的缺省target(必填项);
basedir 用于计算所有其他路径的基路径。

3.2 Targets
一个项目可以定义一个或多个target。
Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。

如果(或如果不)某些属性被设定,才执行某个target: 要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target因该有所判断的属性。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果没有if或unless属性,target总会被执行。

target有下面的属性:
name target的名字(必填项);
depends 用逗号分隔的target的名字列表,也就是依赖表;
if 执行target所需要设定的属性名;
unless 执行target需要清除设定的属性名;
description 关于target功能的简短描述.


3.4 Properties
一个project可以有很多的properties。
可以在buildfile中用property task来设定,或在Ant之外设定。
一个property有一个名字和一个值。
将属性名放在"${""}"之间来表示:==属性值
内置属性:(如)
${os.name}对应操作系统的名字。
ant.file buildfile的绝对路径。
ant.version Ant的版本。
ant.project.name 当前执行的project的名字;由<project>的name属性设定.

例子:
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
(7)
ANT的常用命令
4.1 File(Directory)类
4.1.0
     <fileset dir="${lib.dir}">
        <include name="**/*.jar"/>
     </fileset>
意思是:选择${lib.dir}变量值的目录,以及此目录下的所有的JAR文件.
4.1.1 Mkdir
创建一个目录,如果他的父目录不存在,也会被同时创建。
例子:
<mkdir dir="build/classes"/>
说明: 如果build不存在,也会被同时创建

copy,move,delete的用法相似。

4.1.2 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">
<exclude name="**/
*.java"
/>
</fileset>
</copy>

4.1.3 Delete
1. 删除一个文件
<delete file="/lib/ant.jar"/>
2. 删除指定目录及其子目录
<delete dir="lib"/>
3. 删除指定的一组文件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>

4.1.4 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.1.5
echo
<echo message="...." />

******************
4.2 Java相关
4.2.1 Javac
<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信息
若要在编译时,指定编译器的编码,可以在javac标签中添加属性encoding='utf8'.

4.2.2 java
<java classname="test1.Hello">
    <classpath>
         <pathelement path="WEB-INF/classes"/>
    </classpath>
</java>
相当于
<java classname="test1.Hello" classpath="WEB-INF/classes">

classname中指定要执行的类,classpath设定要使用的环境变量

4.3 打包相关
4.3.1 jar
将一组文件打包
<jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/
Test.class"

manifest=”my.mf”
/>
将${build}/classes下面的所有文件打包到${dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class,manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成.

4.3.2 war
对Jar的扩展,用于打包Web应用
<target name="war" depends="run">
<war destfile="./jason${DSTAMP}.war" webxml="WEB-INF/web.xml">
<fileset dir="WebRoot" />
<lib dir="WEB-INF/lib" />
<classes dir="WEB-INF/classes" />
</war>

4.3.3 ear
用于打包企业应用
<ear destfile="${build.dir}/myapp.ear" appxml="${src.dir}/metadata/application.xml">
<fileset dir="${build.dir}" includes="*.jar,*.war"/>
</ear>

4.4 时间戳
简单但是非常有用的 tstamp 任务:
这个任务通常在某次生成过程开始时调用,比如在一个 init 目标中。这个任务不需要属性,许多情况下只需 <tstamp/> 就足够了。
tstamp 不产生任何输出;相反,它根据当前系统时间和日期设置 Ant 属性。下面是 tstamp 设置的一些属性:
DSTAMP 设置为当前日期,默认格式为yyyymmdd 20031217
TSTAMP 设置为当前时间,默认格式为 hhmm 1603
TODAY 设置为当前日期,带完整的月份 2003 年 12 月 17 日
如:
在调用 tstamp 任务之后,我们能够根据日期命名该 JAR 文件,如下所示:
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>
因此,如果这个任务在 2003 年 12 月 17 日调用,该 JAR 文件将被命名为 package-20031217.jar。
 
 
<copy>标签
该标签用于文件或文件集的拷贝,其属性如下。
.file 表示源文件。<fileset>源目录,可以多个
.tofile 表示目标文件。
.todir 表示目标目录。
<copy todir="${webapp.assemble.webctx}/WEB-INF/classes/">
        <fileset dir="${webapp.build.classesdir}">
         <exclude name="**/*.src" />
        </fileset>
                                                                 //多个file集
        <fileset dir="${webapp.etc.conf.classes}">
         <exclude name="**/*.src" />
        </fileset>
     </copy>
(2)
zip标签:
<target name="zip" depends="webctx">
            <zip destfile="${webapp.assemble.webctx}.zip" basedir="${webapp.assemble.webctx}" encoding="UTF-8" />
</target>
(3)
删除与创建目录,只须dir属性:
<delete dir="${webapp.build}" />
<mkdir dir="${webapp.build}" />

(4)
javac:
    <javac debug="on" deprecation="yes" destdir="${webapp.build.classesdir}" includes="**" optimize="on" srcdir="${webapp.java}">
     <classpath refid="build.classpath" />
     <compilerarg line="-encoding UTF-8 "/>        
    </javac>
srcdir    :必须的,除非嵌套有<src>标签。包含源文件的文件夹    
classpath:The class path to use. 文件夹中class会被导入的jar包    
debug: 当值未为true时产生调试信息    
deprecation: 假如为真,将会给出不建议使用的API,默认值false    
destdir: 编译后文件存放的目标文件夹,默认是当前文件夹。
excludes :必须排除的文件模式的列表,以逗号或空格分隔。如果忽略,将不会排除任何文件(默认排除的文件除外)。    
includes: 必须包括的文件模式的列表,以逗号或空格分隔。如果忽略,将包括所有文件。    
compilerarg设置命令行参数.
(5)
转码:
<native2ascii encoding="gb2312"    src="${webapp.etc.conf.classes}" dest="${webapp.build.classesdir}" includes="**/*.src" ext=".properties" />
(6)
war:
    <war destfile="${webapp.assemble}/${war.name}" webxml="${webapp.etc.conf.webinf}/web.xml">
     <fileset dir="${webapp.docroot}">
        <exclude name="${webapp.etc.conf.webinf}/web.xml" />
        <exclude name="**/lib" />
        <exclude name="**/*.jar" />
        <exclude name="**/*.properties" />
     </fileset>
     <lib dir="${webapp.lib}" />
     <classes dir="${webapp.build.classesdir}" excludes="**/*.src" />
     <classes dir="${webapp.etc.conf.classes}" excludes="**/*.properties,**/*.src" />
     <webinf dir="${webapp.tlds}" />
     <webinf dir="${webapp.etc.conf.webinf}">
        <exclude name="**/lib" />
        <exclude name="**/*.jar" />
        <exclude name="**/*.properties" />
     </webinf>
    </war>
destfile表示生产JAR文件名。
webxml表示web.xml位置
fileset:定义war包下(即根目录)
<lib>,<class>:定义war包中WEB-INF目录下的lib目录的内容,class目录内容.(war包一定要带的)
<webinf>,自定义war包中WEB-INF目录下还要创建的目录及内容.(自定义的)
(6)
javadoc:
用于产生一个api文件(相当于一静态html页面组成的网站).
<javadoc author="true" bottom="Copyright Coship Inc. All Rights Reserved." destdir="${webapp.build.docdir}" doctitle="${appname} API" packagenames="com.*" sourcepath="${webapp.java}" use="true" version="true" windowtitle="${appname} API">
     <classpath refid="build.classpath" />
    </javadoc>
destdir:生成后存放的目录
sourcepath:是你的代码位置,记住是java文件的位置而不是class文件的位置哦
bottom:设置网页底部显示:Copyright Coship Inc. All Rights Reserved.
(7)
XDoclet任务就是Ant的自定义任务:
1. 声明任务
用Ant的<taskdef>任务来声明它。例如:
<taskdef name=”ejbdoclet”
  classname=”xdoclet.modules.ejb.EjbDocletTask”
  classpathref=”xdoclet.lib.path”/>
如果你熟悉Ant的话,你就会知道这段代码是告诉Ant加载<ejbdoclet>的任务定义。classname和classpathref属性告诉Ant到哪里去找实现这个自定义任务的XDoclet类。
一般共通的做法是:
把所有需要使用的XDoclet任务都放在Ant的一个目标里声明,这样在其他的目标里如果需要使用这些任务,只要depends这个任务就可以了。你可能已经在Ant的构建文件里包含了init目标,这就是放置XDoclet任务声明的好地方.如:
<target name=”init”>
  <taskdef name=”documentdoclet”
    classname=”xdoclet.modules.doc.DocumentDocletTask”
    classpathref=”xdoclet.lib.path” />
    <taskdef name=”ejbdoclet”
      classname=”xdoclet.modules.ejb.EjbDocletTask”
      classpathref=”xdoclet.lib.path” />
    <taskdef name=”webdoclet”
      classname=”xdoclet.modules.web.WebDocletTask”
      classpathref=”xdoclet.lib.path” />
</target>
现在,任务声明好了,XDoclet“整装待发”。
2.使用任务
你可以在任何目标里使用声明好的任务。在任务的上下文环境里,可以调动相关的子任务。让我们看一个例子,这个例子调用了<ejbdoclet>任务。不要担心看不懂语法的细节,现在你只需要关心一些基础概念就可以了。
<target name=”generateEjb” depends=”init”>
  <ejbdoclet destdir=”${gen.src.dir}”>
    <fileset dir=”${src.dir}”>
      <include name=”**/*Bean.java”/>
    </fileset>
  <deploymentdescriptor destdir=”${ejb.deployment.dir}”/>
  <homeinterface/>
  <remoteinterface/>
  <localinterface/>
   <localhomeinterface/>
  </ejbdoclet>
</target>
 
 
(9)
打包的执行流程:
设置变量(下面调用)-->初始化(clean操作,创建临时目录)-->编译-->打包-->生成API-->清理临时目录.
具体可参考如下:
<!-- ===================================================    -->
<!--     ABC脚本    -->
<!-- ===================================================    -->
<property name="abc.common.build.dir" location="${abc.common.home}"/>
                .......
                <property name="abc.common.name" value="abc_common" />
    
<!-- ABC后台公共部分生成打包目录 -->
<target name="abc.common.init">
    <mkdir dir="${abc.common.build.dir}"/>
                                .....................
</target>
    
<!-- ABC后台公共部分编译 -->
<target name="abc.common.compile" depends="abc.common.init">
    <copy todir="${abc.common.build.src.dir}">
            <fileset dir="${webapp.java}">
             <include name="com//abc/base/dao/**/**"/>
        <include name="com/abc/base/service/**/**"/>
                             <exclude name="com/abc/common/taglib/**"/>
            </fileset>
     </copy>
    
    <copy file="${webapp.etc.conf.ibatis}\log.xml"                                             todir="${abc.common.build.src.ibatis.dir}"/>
    
    <javac debug="on" deprecation="yes" destdir="${abc.common.build.dist.dir}" includes="**" optimize="on" srcdir="${abc.common.build.src.dir}">
        
     <include name="com//abc/base/dao/**/**"/>
                            <exclude name="com//abc/common/taglib/**"/>
     <classpath refid="build.classpath" />
    </javac>    
    <copy file="${webapp.etc.conf.ibatis}\log.xml" todir="${abc.common.ibatis.dir}"/>
</target>
    
<!-- ABC后台公共部分生成jar包和源文件包 -->
<target name="abc.common.zip" depends="abc.common.compile, abc.common.doc">
    
    <jar destfile="${abc.common.build.dir}\${abc.common.name}_doc.zip"
                     basedir="${abc.common.build.doc.dir}"/>
    
    <jar destfile="${abc.common.build.dir}\${abc.common.name}.jar"
                 basedir="${abc.common.build.dist.dir}"/>
    
    <jar destfile="${abc.common.build.dir}\${abc.common.name}_src.jar"
                     basedir="${webapp.java}">
        
     <include name="com//abc/base/dao/**/**"/>
                            <exclude name="com//abc/common/taglib/**"/>
    </jar>
    
    <delete dir="${abc.common.build.doc.dir}" />
    <delete dir="${abc.common.build.src.dir}" />
    <delete dir="${abc.common.build.dist.dir}" />
</target>
    
<!-- ABC后台公共部分生成API文档 -->
<target name="abc.common.doc">
    <javadoc
                        destdir="${abc.common.build.doc.dir}"
                        author="true"
                        version="true"
                        use="true"
                        windowtitle="ABC后台公共部分 API" sourcepath="${abc.common.build.src.dir}" charset="UTF-8" encoding="UTF-8">
         <doctitle><![CDATA[<h1>ABC后台公共部分 API</h1>]]></doctitle>
         <bottom><![CDATA[<i>Copyright © 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
         <link offline="true" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="C:\tmp"/>
         <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
     </javadoc>
</target>
    
<!-- ABC后台公共部分清理打包目录 -->
<target name="abc.common.clean">
    <delete dir="${abc.common.build.dir}" />
    <delete dir="${abc.common.build.doc.dir}" />
    <delete dir="${abc.common.build.src.dir}" />
    <delete dir="${abc.common.build.dist.dir}" />
</target>