Ant系列四: 常用任务标签

建立一个基本的程序通常有几个常用的任务,像是设置通用属性、创建或删除目录、编译程序、打包、拷贝文件等等。
这些任务,我们都可以在build.xml中编写相应的任务目标[target]

■ 属性设定:<property>

如果一个固定的值(如:目录D:\dev\lib),在多个target中被应用到,这时我们就通过<property>对它设定,应用到它的地方都使用设定的<property>代替,如果日后有发生变化,也只需要改动<property>的设定即可

<target name="defProperty" description="设定属性">
      <property name="tomcat.home" value="C:/jakarta-tomcat" />
     
<property name="app.home"  value="." />
     
<property name="src.home" value="${app.home}/src"/>
     
<property name="lib.home" value="${app.home}/WEB-INF/lib"/>
     
<property name="classes.home" value="${app.home}/WEB-INF/classes"/>
</target>

每个property都有一个name(名称)和一个value(值),要引用某个property可以使用${property-name},像上面的${app.home}。
这些属性的值也可以在执行的时候指定,如:ant -Dapp.home="d:\dev\book",如果执行时没有指定,那么就会使用value上定义的值。


■ 创建目录:<mkdir>

<target name="createDir" description="创建必要的目录">
    
<mkdir dir="test/classes">
    
<mkdir dir="${DIST.DIR}"/>
</target>

如果父目录不存在,也会被同时创建;如test不存在,会先创建test目录,然后在其下创建classes目录。可以看到我们这里使用了一个属性DIST.DIR代替一个具体的目录。

■ 删除目录和文件:<delete>

<target name="delDirAndFile" description="删除目录和文件">
    
<!-- 删除目录 -->
    
<delete dir="${classes.dir}"/>
    
<!-- 删除指定类型的文件 -->
    
<delete file="${jar.file}"/>
    
<!-- 删除指定目录的一组文件 -->
    
<delete>
       
<fileset dir="${classes.dir}" includes="**/*.class"/>
    
</delete>
    
<!-- 删除指定目录及子目录,同时也删除它自己 -->
    
<delete includeEmptyDirs="true">
       
<fileset dir="build"/>
    
</delete>
</target>


■ 拷贝文件和目录:<copy>

<target name="copyFileAndDir" description="拷贝文件和目录">
    
<!-- 拷贝单个文件 -->
    
<copy file="error.log" tofile="debug.log"/>
    
    
<!-- 拷贝单个文件到指定目录 -->
    
<copy file="error.log" todir="${LOG.DIR}"/>

    
<!-- 拷贝多个文件到指定目录 -->
    
<copy todir="${LOG.DIR}">
        
<fileset dir="log">
            
<include name="**/*.log"/>
            
<exclude name="**/error.log"/>
        
</fileset>
    
</copy>
    
<!-- 同上 -->
    
<!--
    <copy todir="${LOG.DIR}">
        <fileset dir="log" excludes="**/*.txt"/>
    </copy>
    
-->

    
<!-- 拷贝一个目录到另一个目录 -->
    
<copy todir="newbin">
       
<fileset dir="bin"/>
    
</copy>
</target>


■ 移动或重命名文件、目录:<move>

<target name="moveFileAndDir" description="移动或重命名文件和目录">
    
<!-- 移动或重命名一个文件 -->
    
<move file="error.log" tofile="debug.log"/>

    
<!-- 移动或重命名一个文件到另一个目录下 -->
    
<move file="error.log" todir="new/log"/>

    
<!-- 将目录移到另一个目录下 -->
    
<move todir="new/log">
        
<fileset dir="log"/>
    
</move>

    
<!-- 一组文件移到另一个目录下 -->
    
<move todir="new/log">
        
<fileset dir="log">
            
<include name="**/*.log"/>
            
<exclude name="**/error.log"/>
        
</fileset>
    
</move>  
</target>

 

■ 打Jar包:<jar>

.<jar>标签
该标签用来生成一个JAR文件,其属性如下。
(1) destfile表示JAR文件名。
(2) basedir表示被归档的文件名。
(3) includes表示别归档的文件模式。
(4) exchudes表示被排除的文件模式。

<?xml version="1.0"?>
<project name="javaTest" default="jar" basedir=".">
    
<target name="clean">
       
<delete dir="build"/>
    
</target>
    
<path id="classpath">  
        
<fileset  dir="lib">
          
<include name="*.jar"/>
        
</fileset>
    
</path>
    
<target name="compile" depends="clean">
       
<mkdir dir="build/classes"/>
      
<javac srcdir="src" destdir="build/classes" encoding="UTF-8">
          
<classpath refid="classpath"/>   
      
</javac>
    
</target>
    
<target name="run" depends="compile">
       
<java classname="Main">
           
<classpath>
              
<!--<classpath refid="classpath"/>-->
              
<pathelement path="build/classes"/>
           
</classpath>
       
</java>
    
</target>
    
<target name="copyConfig" depends="run">   
        
<copy todir="build/classes">   
                
<fileset dir="src">
                     
<include name="*.png" />
                
</fileset>
        
</copy>          
    
</target>    

    
<target name="jar" depends="copyConfig">
        
<pathconvert property="mf.classpath" pathsep=" ">
             
<mapper>
                 
<chainedmapper>
                     
<flattenmapper />
                     
<globmapper from="*" to="lib/*" />
                 
</chainedmapper>
             
</mapper>
             
<path refid="classpath" />
         
</pathconvert>


    
<jar destfile="main.jar" basedir="build/classes">
               
<manifest>
                  
<attribute name="Main-class" value="Main"/>
                      
<attribute name="Class-Path" value="${mf.classpath} "/>
               
</manifest>
     
</jar>
    
</target>
</project>

 

java编译:<javac>

.<javac>标签
该标签用于编译一个或一组java文件,其属性如下:
(1).srcdir表示源程序的目录。
(2).destdir表示class文件的输出目录。
(3).include表示被编译的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的类路径。
(6).debug表示包含的调试信息。
(7).optimize表示是否使用优化。
(8).verbose 表示提供详细的输出信息。
(9).fileonerror表示当碰到错误就自动停止。

 

Ant的javac任务用于实现编译Java程序的功能。下面来看一个简单的例子:
首先我们建立名为antstudy的Java工程,建立src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。该类文件的内容如下:
public class HelloWorld {
    public static void main(String[] args) {
       System.out.println("Hello,Amigo");
    }
}

同时在antstudy工程的根目录下建立build.xml文件,在该文件中编译src目录下的java文件,并将编译后的class文件放入build/classes目录中,在编译前,需清除classes目录,该文件的内容如下:
 

<?xml version="1.0"?>
<project name="javacTest"default="compile" basedir=".">
    <target name="clean">
       <delete dir="build"/>
    </target>

    <target name="compile" depends="clean">
       <mkdir dir="build/classes"/>
    <javac srcdir="src" destdir="build/classes"/>
    </target>
</project>

运行该build.xml文件,可在工程中看到新增了build/classes目录,并在该目录中生成了编译后的HelloWorld.class文件。

 

■ 执行class:<java>
.<java>标签
该标签用来执行编译生成的.class文件,其属性如下。
(1).classname 表示将执行的类名。
(2).jar表示包含该类的JAR文件名。
(3).classpath所表示用到的类路径。
(4).fork表示在一个新的虚拟机中运行该类。
(5).failonerror表示当出现错误时自动停止。
(6).output 表示输出文件。
(7).append表示追加或者覆盖默认文件。

Ant中可以使用java任务实现运行Java程序的功能。下面在1的例子中进行如下的修改,修改后的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>
</project>

运行该build.xml文件,可在控制台看到HelloWorld的main方法的输出。

 

使用Ant的jar任务生成jar文件
读者可以在上例的基础上更进一步,来生成jar包,可在run这个target下再加上如下target:
<target name="jar" depends="run">
<jar destfile="helloworld.jar" basedir="build/classes">
           <manifest>
              <attribute name="Main-class" value="HelloWorld"/>
           </manifest>
       </jar>
</target>
此时将ant的project的default属性设置为jar,同时运行该build.xml文件,运行完毕后,可看到在工程目录下生成了一个jar包HelloWorld.jar。

 使用Ant的war任务打包J2EE Web项目
建立一个J2EE Web工程,其目录结构如下图所示:

其中src为源代码目录,WebRoot为各jsp存放目录,lib为工程的包目录。在antwebproject工程目录下建立了build.xml文件,该文件为该工程的Ant构件文件。读者可以src目录下放入在前续例子中开发的HelloWorld.java文件,并在WebRoot下建立index.jsp文件,其内容很简单,就是输出Hello信息,代码如下所示:


<%@ page language="java" contentType="text/html; charset="UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
       <title>ant打包测试</title>
    </head>
    <body>
       Hello,Ant
    </body>
</html>


   接下来编写build.xml文件,其内容如下:

 

<?xml version="1.0"?>
<project name="antwebproject"  default="war"basedir=".">
 <property name="classes" value="build/classes"/>
    <property name="build"value="build"/>
    <property name="lib"value="WebRoot/WEB-INF/lib"/>
    <!-- 删除build路径-->
    <target name="clean">
       <delete dir="build"/>
    </target>

    <!-- 建立build/classes路径,并编译class文件到build/classes路径下-->
    <target name="compile" depends="clean">
       <mkdir dir="${classes}"/>

       <javac srcdir="src" destdir="${classes}"/>
    </target>

    <!-- 打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>
</project>

 

各target的作用在内容中已经进行说明,在此不再赘述。运行该build文件,更新目录后,可看到在build目录下生成了antwebproject.war文件,解开后可看到其目录结构如下:
--META-INF
     --MANIFEST.MF
--index.jsp
--WEB-INF
     --lib
            --log4j-1.2.9.jar
     --classes
            --HelloWorld.class
     --web.xml
     读者可以将该war包拷贝到Tomcat的目录下看一下运行结果。

■ 输出消息:<echo>
.<echo>标签
该任务的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下:
<echo message="Hello,Amigo" file="logs/system.log" append="true">
 

你可能感兴趣的:(Ant系列四: 常用任务标签)