ant的构建文件2

一. ant build.xml解释:

 

1.项目工程:

<project name="simple Buildfile" default="compile" basedir=".">
</project>
 

<project>有3个属性:

name ->为工程提供一个名字。

default ->构建文件中的一个目标,在运行ant是如果不指定目标, ant就默认运行default中的目标。

basedir ->定义工程的根目录。一般为“.” ,也是当前构建文件所在目录,不论运行ant 是在哪个目录下。

 

2. 目标(target):

目标包括做具体工作的任务,将完成最终的目标。

 

以下目标将编译一组文件,并将它们打包到一个名为finallib.jar的文件中。

<target name="build-lib">
	<javac srcdir="${src.ejb.dir}:${src.java.dir}" destdir="${build.dir}" debug="on" 
		    deprecation="on" includes="**/*.java" excludes="${global.exclude}">
		<classpath>
			<pathelement location="."/>
			<pathelement location="${lib.dir}/somelib.jar"/>
		</classpath>
	</javac>
	<jar jarfile="${dist}/lib/finallib.jar" basedir="${build.dir}"/>
</target>

 

3. 任务:

 任务是构建文件中最小的构建块,包括编译源代码,对类打包,由CVS获取修订情况或者是复制文件和目录

<copy todir="${weblogic.dir}/${weblogic.server.home}/public_html/jsp">
      <fileset dir="${src.www.dir}/jsp"/>
</copy>

注:对于copy任务,不能因为它嵌套<fileset>元素而认为它是copy对象的子类。

 

4. 数据元素:

    数据元素分两类: 特性和DataType.

 

1). 特性(property)

       在构建文件中由<property>标签表示的名-值对。

<property name="property.one" value="one" />
<property name="property.two" value="${property.one}:two" />
   

特性的一个好处就是其值是类型不可知的,如:一个特性表示目录,此特性并不知道其值是一个目录,也不关心此目录是否存在。但是又时希望对定义路径有更多的控制,对此就可以使用DataType.

 

 

2). DataType

     一类表示复杂数据集合的元素,例如fileset和path等。

使用特性表示的路径:

<property name="classpath" value="${lib.dir}/j2ee.jar:${lib.dir}/activation.jar:${lib.dir}/servlet.jar:${lib.dir}/jasper.jar:${lib.dir}/crimson.jar:${lib.dir}/jaxp.jar"/>
 

 改为使用fileset DataType 表示:

<path id="classpath">
       <fileset dir="${lib.dir}">
             <include name="j2ee.jar"/>
             <include name="activation.jar"/>
             <include name="servlet.jar"/>
 ..................
       </fileset>
</path>

  可使用通配符来表示:

<path id="classpath">
       <fileset dir="${lib.dir}">
             <include name="**/*.jar"/>
       </fileset>
</path>
 

数据元素(data element)

     涵盖了特性和DataType

 

二. 一个实例工程及构建文件:

1. 工程目录结构图

irsslbo1-1.0.4

/bin(可选的)             //存放应用脚本(无论是安装还是执行脚本) windows-->bot.bat;unix-->bot.sh

/build(临时的)          //存放编译后的类文件

    /lib

    /bin

    /doc

    /irssibot(顶级包)

/src                        //源代码

/doc                      //存放非javaDoc文档,终端用户文档及库的文档

/dist(临时的)          //发布最终产品的位置,非归档的内包,jar,war,EAR和TAR

       /lib      //存放jar

       /bin    //

       /doc

       /config

/lib                        //存放工程所用到的jar等库文件

 

 

2. 设计和编写实例构建文件

 

   (1). 构建文件如何开始? 

构建文件由一个工程描述文件(project descriptor)开始,指定你工程名,默认的构建文件目标以及工程基目录等内容。

将此工程称为:irssibot,默认的目标为all;

<?xml version="1.0"?>
<!-- Comments are just as important in buildfiles,do not  -->
<!-- avoid writing them! -->
<!-- exmaple build file for "ant: the definitive guide" -->
<!-- and its sample project: irssibot -->
<project name="irssibot" difault="all" basedir=".">

 

    (2). 应该定义哪些特性和DataType以用于整个构建中?

为每个子目录定义一个特性,并根据他的作用为之命名(即全局变量),这样即使目录名修改了只要在构建文件中修改一处即可。

<!-- project directories -->
<property name="src.dir" value="src" />
<property name="doc.dir" value="doc" />
<property name="dist.dir" value="dist" />
<property name="lib.dir" value="lib" />
<property name="bin.dir" value="bin" />
<!-- Temporary build directory names -->
<property name="build.dir" value="build" />
<property name="build.classes" value="${build.dir}/classes" />
<property name="build.doc" value="${build.dir}/doc" />
<property name="build.lib" value="${build.dir}/lib" />

  

对于某些任务,对特性也适于采用全局定义,列如:定义一个全局特性,它将通知javac任务是否生成带调试信息的字节码。

因此javac任务的所以实例都会使用此特性。

<!-- global settings -->
<property name="debug.flag" value="on"/>
 

设置build.compiler特性,在此其值为modern,它表示javac使用java SDK工具包(即Java SDK 1.3及更高版本)中可用的,最新版本的SUN编译器。 对于许多刚开始接触Ant的人,如果发现此处有该特性,而该特性在构建文件中从来没有再用到,就会感到困惑。

<!-- global magic property for <javac> -->
<property name="build.compiler" value="modern" />

 

深入到工程主要目标之前,还有最后一步需要完成,irssibot工程附带你 一组库,即mysql.jar和xerces.jar。

为此我们定义了类路径(classpath),它包括你这些库,而且还可以加入我们自己将类可能增加的库,库都放在lib目录下。

<path id="classpath">
       <fileset dir="${lib.dir}">
             <include name="**/*.jar"/>
       </fileset>
</path>

 

(3). 创建目录,在对目标进行编译或打包时,需要创建哪些目录?

ant将所有已编译的类文件保存在build目录及其子目录下,所以我们要创建此构建目录。

另外,增加你一些内容,记录构建的时间,这对于自动的构建极为有用。

<!-- Target to create the build directories prior to a compile target -->
<!-- we also mark the start time of the build for the log. -->
<target name="prepare">
      <mkdir dir="${build.dir}"/>
      <mkdir dir="${build.lib}"/>
      <mkdir dir="${build.classes}"/>
      <mkdir dir="${build.classes}/modules"/>

      <tstamp/>

      <echo message="${TSTAMP}"/>
</target>

 

(4). 编译工程并打包至JAR(可以将编译和打包分成两步来完成)

<!-- Build the IRC bot application -->
<target name="bot" depends="prepare">

       <!-- compile the application classes, not the module classes -->
       <javac destdir="${build.classes}" debug="${debug.flag}">
                   deprecation="on">

             <!-- we could have used javac srcdir attribute -->
             <src path="${src.dir}"/>
            // 此句是不执行modules包目录下的java文件
             <exclude name="irssibot/modules/**"/>
             <classpath refid="classpath"/>
       </javac>

       <!-- package the application into a JAR -->
       <jar jarfile="${build.lib}/irssibot.jar" 
              basedir="${build.classes}">
          //除了modules模块包目录下的文件其他文件都打包到irssibot.jar
           <exclude name="irssibot/modules/**"/>
       </jar>
</target>

 

(5). irssibot还包括一组模块,它们扩展了bot的功能,在此将模块编译并打包成一个单独的JAR。将模块类文件和应用类文件相分离,使得修改和增加模块更方便,不易混淆。

<!-- Build the IRC bot modules -->
<target name="modules" depends="prepare,bot">

     <!-- compile the application classes, not the module classes -->
       <javac destdir="${build.classes}/modules" 
                   debug="${debug.flag}"  deprecation="on">

             <!-- we could have used javac srcdir attribute -->
             <src path="${src.dir}"/>
             <include name="irssibot/modules/**"/>
             <classpath refid="classpath"/>
       </javac>

       <!-- bundle the modules as a JAR -->
       <jar jarfile="${build.lib}/irssimodules.jar" 
              basedir="${build.classes}/modules">
           <include name="irssibot/modules/**"/>
       </jar>
</target>

 

(6). 构建默认目标叫all, 如果调用ant时未带有任何参数,则ant会执行all目标。

(建议编写一个帮助目标,在调用ant不带任何参数时显示文件的帮助文档).

<target name="all" depends="bot,modules"/>

在执行这个目标时,在运行all内部的任何元素之前,会执行bot和modules这两个目标,而且必须按顺序成功地完成,这样ant才能开始处理all,在此all目标中没有任何元素,因此bot和modules目标的成功就相当于all目标成功。

 

 

(7). 构建javaDoc目标,与编译相比,JavaDoc的处理非常慢,不希望每次构建时都等待JavaDoc的处理,在编写自己的JavaDoc目标时请考虑这些问题。

<!-- generate the API documentation irssibot and the -->
<!-- modules -->
<target name="javadoc depends="bot">

      <mkdir dir="${doc.dir}/api"/>
      <javadoc packagenames="irssibot.*"
                     sourcepath="${doc.dir}/api"
                     author="true" version="true"
                     use="true">
           <classpath refid="classpath"/>
      </javadoc>
</target>
 

(8). 清除构建文件

应该将构建过程中生成的所有内容都予以删除,并重新开始构建,只有这样才能保证所有需要编译的内容确保得到编译,将这样的构建成为干净的构建(clean build)。

虽然javac任务要对已编译的类文件进行时间戳检查,但不是最佳,对于无依赖关系的类,带有静态最终处理(final)的类以及其他特殊情况,可能导致构建失败(从Ant的角度看是成功的)。

<!-- delete class files built during previous buids. Leave directories -->
<target name="clean">
      <delete>
            <fileset dir="${build.classes}" includes="**/*.class"/>
      </delete>
</target>

<!-- delete any created directories and their contents -->
<target name="cleanall" depends="clean">
       <delete dir="${build.dir}"/>
       <delete dir="${dist.dir}"/>
       <delete dir="${doc.dir}/api"/>
</target>

  注: cleanall并不需要依赖于clean,不过在实际应用中,clean目标可能不仅仅是删除文件,在这种情况下,我们希望Ant在cleanall中处理clean,为安全起见,默认的包括此依赖关系是一种不错的做法。

 

(9). 发布工程

  • 在应用准备发布之前,需要创建哪些目录?
  • 是否需要将源代码与应用同时发布?
  • 应用的发布由哪些内容组成?

下面的目标将创建发布目录,并复制类文件,脚本和最终应用的其他组件

<!-- deploy the application in a "ready-to-run " state -->
<target name="deploy" depends="bot,javadoc">
     <!-- create the distributioin directory -->
     <mkdir dir="${dist.idr}"/>
     <mkdir dir="${dist.idr}/bin"/>
     <mkdir dir="${dist.idr}/lib"/>
     <mkdir dir="${dist.idr}/doc"/>
     <mkdir dir="${dist.idr}/config"/>

     <!-- copy the primary program and modules -->
     <copy todir="${dist.dir}/lib">
           <fileset dir="${build.classes}"/>
           <fileset dir="${build.lib}" includes="irssibot.jar"/>
           <fileset dir="${build.lib}" includes="irssimodules.jar"/>
           <fileset dir="${build.lib}" includes="*.jar"/>
     </copy>

     <!-- copy the documentation -->
     <copy todir="${dist.dir}/doc">
            <fileset dir="${doc.dir}"/>
     </copy>

     <!-- copy the pre-fab configuration files -->
     <copy todir="${dist.dir}/config">
           // 此任务只复制XML文件,配置目录(表示为${lib.dir})中的其余内容均保持不动
           <fileset dir="${lib.dir}" includes="*.xml"/>
     </copy>

      <!-- copy the running scripts -->
      <copy todir="${dist.dir}/bin">
            <fileset dir="${bin.dir}" includes="bot.sh"/>
            <fileset dir="${bin.dir}" includes="bot.bat"/>
      </copy>

</target> 

 

(10). irssibot工程的完整构建文件

<?xml version="1.0" encoding="utf-8"?>

<!-- Comments are just as important in buildfiles,do not  -->
<!-- avoid writing them! -->
<!-- Example build file for "Ant: The definitive guide" -->

<project name="irssibot" default="all" basedir=".">
	
	<!-- project-wide settings. all directories are relative to the  -->
	<!-- project directories -->
	<property name="src.dir" value="src"/>
	<property name="doc.dir" value="doc"/>
	<property name="dist.dir" value="dist"/>
	<property name="lib.dir" value="lib"/>
	<property name="bin.dir" value="bin"/>
	
	<!-- build directories -->
	<property name="build.dir" value="build" />  
	<property name="build.classes" value="${build.dir}/classes" />  
	<property name="build.doc" value="${build.dir}/doc" />  
 	<property name="build.lib" value="${build.dir}/lib" />  
	
	<!-- global settings -->  
	<property name="debug.flag" value="on"/> 
	<property name="java.lib" value="${java.home}/jre/lib/rt.jar"/>
	
	<!-- global property for <javac> -->
	<property name="build.compiler" value="modern"/>
	
	<path id="classpath">
		<fileset dir="${lib.dir}">
			<include name="**/*.jar"/>
		</fileset>
	</path>
	
	<target name="prepare">
		<mkdir dir="${build.dir}"/>
		<mkdir dir="${build.lib}"/>
		
		<tstamp/>
		
		<echo message="${TSTAMP}"/>
	</target>
	
	<target name="all" depends="bot,modules"/>
	
	<!-- build the IRC bot application -->
	<target name="bot" depends="prepare">
		<mkdir dir="${build.classes}"/>
		<javac destdir="${build.classes}" debug="${debug.flag}"
		       deprecation="on">
			<!-- we could have used javac srcdir attribute -->
			<src path="${src.dir}"/>
			<exclude name="irssibot/modules/**"/>
			<classpath refid="classpath"/>
		</javac>
		
		<jar jarfile="${build.lib}/irssibot.jar"  basedir="${build.classes}">
			<exclude name="irssibot/modules/**"/>
	   	</jar>
	</target>
    
	<!-- build the IRC bot modules -->
	<target name="modules" depends="prepare,bot">
		<mkdir dir="${build.classes}/modules"/>
		<javac destdir="${build.classes}/modules"
		        debug="${debug.flag}" deprecation="on">
			<!-- we could have used javac srcdir attribute -->
			<src path="${src.dir}"/>
			<include name="irssibot/modules/**"/>
			<classpath refid="classpath"/>
		</javac>
		<jar jarfile="${build.lib}/irssimodules.jar"
		      basedir="${build.classes}/modules"
			  manifest="MANIFEST.MF">
			<manifest>
				<attribute name="ModuleType" value="irssibot"/>
			</manifest>
			<include name="irssibot/modules/**"/>
		</jar>
	</target>
	
	<!-- deploy the application in a "ready-to-run" state -->
	<target name="deploy" depends="bot,javadoc">  
    	<!-- create the distributioin directory -->  
      	<mkdir dir="${dist.idr}"/>  
    	<mkdir dir="${dist.idr}/bin"/>  
     	<mkdir dir="${dist.idr}/lib"/>  
     	<mkdir dir="${dist.idr}/doc"/>  
      	<mkdir dir="${dist.idr}/config"/>  
		
		<!-- copy the primary program and modules -->  
     	<copy todir="${dist.dir}/lib">  
            <fileset dir="${build.classes}"/>  
            <fileset dir="${build.lib}" includes="irssibot.jar"/>  
           	<fileset dir="${build.lib}" includes="irssimodules.jar"/>  
           	<fileset dir="${build.lib}" includes="*.jar"/>  
      	</copy>  
		
		<!-- copy the documentation -->  
        <copy todir="${dist.dir}/doc">  
             <fileset dir="${doc.dir}"/>  
      	</copy>  
  
      	<!-- copy the pre-fab configuration files -->  
      	<copy todir="${dist.dir}/config">  
            <fileset dir="${lib.dir}" includes="*.xml"/>  
      	</copy>  
   
       	<!-- copy the running scripts -->  
       	<copy todir="${dist.dir}/bin">  
             <fileset dir="${bin.dir}" includes="bot.sh"/>  
             <fileset dir="${bin.dir}" includes="bot.bat"/>  
       	</copy> 
	</target>
	
	<!-- generate the API documentation for the IRC library and the -->
	<!-- IRC bot using the library -->
	<target name="javadoc" depends="bot">
		<mkdir dir="${doc.dir}/api"/>
		<javadoc packagenames="irssibot.*" sourcepath="${src.dir}"
		         destdir="${doc.dir}/api" 
				 classpath="${lib.dir}/xerces.jar:${lib.dir}/mysql.jar"
				 author="true" version="true" use="true"/>
	</target> 
	
	<!-- delete class files built during prebvious builds Leave directories -->
	<target name="clean">
		<delete>
			<fileset dir="${build.classes}" includes="**/*.class"/>
		</delete>
		<delete dir="${doc.dir}/api"/>
	</target>
	
	<!-- delete any created directories and their contents -->  
 	<target name="cleanall" depends="clean">  
        <delete dir="${build.dir}"/>  
        <delete dir="${dist.dir}"/>  
        <delete dir="${doc.dir}/api"/>  
 	</target>  
	
</project>
	
	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值