`
wangduowu
  • 浏览: 134503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ant的构建文件2

    博客分类:
  • ant
阅读更多

一. 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>
	
	

 

分享到:
评论

相关推荐

    ANT构建的一个问题

    它通过XML定义的构建文件来描述构建步骤,使得开发者可以自动化编译、打包、测试等任务。 在描述中提到的“NULL”可能是指在尝试解决这个问题时,遇到了空指针异常(NullPointerException)或者是某个预期的对象或...

    build.xml ant构建配置文件

    build.xml ant构建配置文件

    Ant构建文件

    标题中的“Ant构建文件”指的是Apache Ant,一个Java平台上的开源构建工具。它被广泛用于自动化Java项目的构建、编译、测试和部署过程。Ant基于XML,开发者可以通过编写XML配置文件来定义构建任务,这些任务可以是...

    ant 构建AXIS2

    这一过程的关键在于理解Ant的构建文件和AXIS2的项目结构,确保所有依赖项都已就绪,并正确配置了构建参数。通过这一流程,开发者可以高效地管理AXIS2项目,从源码到可部署的服务进行自动化构建。

    ant 构建环境使用

    Ant的核心是build.xml文件,这是一个包含了一系列任务(tasks)的XML文档,这些任务定义了构建过程中的各种操作,如编译源代码、打包JAR文件、运行测试等。 描述中提到"ant-1.9.6.jar"是Ant的特定版本,这个版本...

    ant构建以及基本运用

    2. 构建文件build.xml: build.xml包含了多个目标(target),每个目标是一系列任务(task)的集合。任务是Ant的基本工作单元,例如编译、复制、打包等。通过设置属性(property),可以为构建过程提供可配置的参数...

    ant配置文件

    在myEclipse这样的集成开发环境中,可以方便地创建和管理这些Ant构建文件。 描述中提到的“ANT自编译的程序”是指利用Ant工具来自动化编译自身的过程。Ant能够处理编译Java源代码、生成JAR或WAR包、清理构建目录等...

    Ant 项目构建教程

    2. `ant -buildfile test.xml`:指定要使用的构建文件,即`test.xml`,并执行默认目标。 3. `ant -buildfile test.xml dist`:使用`test.xml`文件,执行名为`dist`的目标。 4. `ant -buildfile test.xml -Dbuild=...

    ant-build_xm文件说明,对用ant构建进行了详细的说明!

    在本文中,我们将深入探讨Ant构建文件(build.xml)中的各个关键字及其用法。 首先,我们要理解Ant构建文件的基本结构。一个典型的build.xml文件通常包含以下几个部分:project元素,target元素,以及task元素。`...

    ANT项目构建

    #### 三、Ant构建文件详解 **构建文件**:构建文件是Ant的核心,它是一个XML文件,通常命名为 `build.xml`。这个文件定义了项目的构建逻辑,包括构建的不同阶段、依赖关系以及具体的操作指令。 - **基于XML的结构*...

    ant一键构建工具

    Ant是Apache软件基金会开发的一款Java语言的构建工具,它的出现是为了替代Make等传统构建工具,更好地适应Java项目的需求。...通过编写和优化Ant构建文件,开发者可以提升项目的可维护性和持续集成的能力。

    使用ant构建helloworld

    - `project`元素是Ant构建文件的根元素,它包含了一系列的属性和目标。 - `property`元素用于定义属性,如源代码目录和构建目录。 - `target`元素定义了一个个可执行的任务,例如`init`用于创建目录,`compile`用于...

    Ant构建中使用JS脚本方法

    Ant是基于XML的,它的主要构建文件是`build.xml`,其中包含了构建任务的定义。这些任务可以是简单的文件操作,如复制或删除,也可以是复杂的编译、测试和打包过程。Ant提供了许多内建的任务,但有时候这些内建任务...

    使用Ant构建批量压缩js、css文件脚本

    3. **在Ant构建文件中引入YUI Compressor**:在build.xml中,使用`&lt;taskdef&gt;`标签引入YUI Compressor的任务定义,例如: ```xml ``` 4. **定义压缩目标**:创建一个或多个目标,分别处理js和css文件...

    最全的Ant文件

    1. "CheckPeopleIsExist.sln" - 这通常是Visual Studio的解决方案文件,虽然Ant主要用于Java,但这个文件可能是用C#或VB.NET编写的项目,且可能与Ant构建过程有关联,例如使用Ant进行跨平台构建。 2. ...

    ant的build文件说明

    1. ****:这是整个构建文件的根元素,它定义了项目的基本属性,如项目名称、默认目标等。 2. ****:这是构建过程中的具体步骤或阶段,每个`target`可以包含多个任务。你可以设置依赖关系,让某个`target`在另一个`...

    ant 配置文件集合

    - 属性可以在整个构建文件中使用,通过`&lt;property&gt;`元素定义,例如设置源代码目录、输出目录等。 - 属性可以被继承和覆盖,提供灵活的配置。 - 使用`${property_name}`引用属性值。 3. **路径元素(Path)** - ...

    ANT文件详解 ant介绍 ANT 命令

    ### ANT文件详解:深入理解ANT及其在项目构建中的应用 #### Ant的概念与起源 ...通过深入理解Ant的工作原理和构建文件的配置方式,开发者能够更高效地管理和自动化项目构建流程,提高软件开发的生产力。

    【构建工具Ant环境搭建】

    现在,让我们创建一个简单的Ant构建文件。在任意目录下创建一个名为`build.xml`的文件,内容如下: ```xml &lt;project name="HelloAnt" default="compile"&gt; ${build.dir}"/&gt; ${build.dir}/classes"/&gt;...

Global site tag (gtag.js) - Google Analytics