ANT构建脚本

ANT构建脚本 1.3.0
 
张经纬 2006-10-29
 
ANT官方站: http://ant.apache.org/
 
  我们的项目中有一个主项目和几个小项目,主项目有几个人同时开发,小项目通常是由一个人开发。在开发过程中,除了最终的发布版本,还需要对小版本进行管理。
  小版本的管理有些麻烦,因为在打包时,开发人员通常也只是打包源代码。作为开发人员不会每天晚上完成工作后,把项目所需要的东西完整的打包在一起,不现实且效率也低。但从管理的角度来看,这是有用的,除了浪费一些存储空间,这种方式有助于项目经理了解项目的进展情况,对风险控制也是有益的。
 
  我们项目使用subversion做版本控制,每个项目都有下面的结构:
    Project
    ├─debug
    │  ├─bin
    │  ├─conf
    │  ├─classes
    │  ├─doc
    │  ├─lib
    │  └─src
    └─release
        ├─project-1.0.0
        │   ├─bin
        │   ├─conf
        │   ├─doc
        │   ├─lib
        │   └─src
        ├─project-1.0.1
        │   ├─bin
        │   ├─conf
        │   ├─doc
        │   ├─lib
        │   └─src
        └─project-1.2.0
             ├─bin
             ├─conf
             ├─doc
             ├─lib
             └─src
  开发人员从debug上checkout出来要开发的项目,完成后commit,在需要更新版本时,使用ant的构建脚本自动构建出完整的分发包,再从本地import到版本库中。当本地workcopy很干净时,也可以直接创建一个分技到新的带有版本号的目录中(例:./release/project-1.2.1/)。我们通常使用第一种做法,打包后import到版本库中。
 
  分发包使用ANT的构建文件(build.xml)自动构建。ANT的使用并不难,内容也不多。关键是在构建时的目的,和要遵循的原则。
  1. 在开发时构建。
    在unix下面工作时,经常没有IDE。用ant来构建比用命令行方便。当然也可以写脚本,但脚本的移植性不好。
  2. 为了分发构建。
    构建的目的是构建用户最终使用的版本(可以不包括源代码)。
  3. 为了开发构建。
    在开源社区里,代码是共享的。这时构建的目的,一方面是分发,给最终用户使用,另一方面是提供给用户能够再次开发的版本。
 
  我们现在使用的构建文件是参考了几个开源包里的build.xml文件后,自己做的,现在是的版本1.3.0。编写时的思路是用户能够使用发构建出来的分发包,再次构建分发包,不修改或少修改构建文件。可以理解为嵌套。
 
  这个配置文件在使用时,只需要修改几个主要参数:
    项目名称:别的不用说,只是在构建jar包时也会用到;
    版本号:分为主版本、次版本和修改版本;
    主要项目路径:源代码(src.dir)、库目录(lib.dir)、文档目录(doc.dir)等;
    主要构建路径:源代码(dist.src.dir)、库目录(dist.lib.dir)、文档目录(doc.dir)等。
 
  另外,如果项目有需要,如有测试用例,可以打开构建选项:
  <property name="switch.copytestcase" value="">
  这个选项,默认是被注释掉的。
 
  需要注意一点,如果希望构建出来的分发包可以使用包中的build.xml不加修改的再次构建,就需要在设置路径时,都以项目路径为根目录来设置。如果使用绝对地址,多数情况构建出来的分发包再构建时要出错了。
  这个脚本现在仍在改进中,有兴趣的朋友可以一起讨论。
 
  下面的配置文件,也可以下载: build.xml
 

<?xml version="1.0"  encoding="GB2312"?>
<!-- ======================================== -->
<!-- 标准构建文件 v1.3.0                      -->
<!-- 使用前请修改:                           -->
<!--     项目名称                             -->
<!-- ======================================== -->

<!-- ======================================== -->
<!-- [project_name] 构建文件                  -->
<!-- auther:                                  -->
<!-- date  : @build_date@                     -->
<!-- ======================================== -->

<project name="[project_name]" basedir="./" default="build">

 <!-- 记录构建时间 -->
 <tstamp>
  <format property="exedate" pattern="yyyy-MM-dd" />
  <format property="exetime" pattern="hh:mm:ss" />
 </tstamp>

 <!-- ================================================= -->

 <!-- 项目名称、版本,用于创建文件名 -->
 <property name="Name" value="[big_project_name]" />
 <property name="name" value="[small_project_name]" />
 <property name="name2" value="[short_project_name]" />

 <!-- 版本号:[主版本-次版本-修订号] -->
 <property name="version.major" value="1" />
 <property name="version.minor" value="0" />
 <property name="version.patch" value="0" />

 <!-- 版本号: 无修订号 -->
 <property name="version.sansPatchLevel" value="${version.major}.${version.minor}" />
 <!-- 版本号:完整版本号 -->
 <property name="version.full" value="${version.sansPatchLevel}.${version.patch}" />
 <!-- 完整名称 -->
 <property name="fullname" value="${name}-${version.full}" />

 <!-- ant构建文件名 -->
 <property name="buildfile" value="build.xml" />

 <!-- jar包名 -->
 <property name="jar.file" value="${fullname}.jar" />

 <!-- ================================================= -->

 <!-- 源代码目录 -->
 <property name="src.dir" value="src" />
 <property name="etc.dir" value="conf" />
 <property name="bin.dir" value="bin" />
 <property name="lib.dir" value="lib" />
 <property name="jdbc.dir" value="${lib.dir}" />
 <property name="class.dir" value="classes" />

 <!-- 文档目录 -->
 <property name="doc.dir" value="doc" />
 <property name="doc.api.dir" value="${doc.dir}/api" />
 <property name="doc.ref.dir" value="${doc.dir}/reference" />

 <!-- 示例路径源代码目录 -->
 <property name="example.dir" value="examples" />

 <!-- 测试用例源代码目录 -->
 <property name="testcase.dir" value="test" />
 
 <!-- ====================================== -->

 <!-- 目标根目录 -->
 <property name="dist.root" value="dist" />
 <property name="dist.dir" value="${dist.root}/${fullname}" />

 <!-- 目标目录 -->
 <property name="dist.src.dir" value="${dist.dir}/src" />
 <property name="dist.etc.dir" value="${dist.dir}/conf" />
 <property name="dist.bin.dir" value="${dist.dir}/bin" />
 <property name="dist.lib.dir" value="${dist.dir}/lib" />
 <property name="dist.jdbc.dir" value="${dist.dir}/lib" />
 <property name="dist.class.dir" value="${dist.dir}/classes" />

 <!-- 目标文档目录 -->
 <property name="dist.doc.dir" value="${dist.dir}/doc" />
 <property name="dist.api.dir" value="${dist.dir}/doc/api" />
 <property name="dist.ref.dir" value="${dist.dir}/doc/reference" />

 <!-- 示例目标目录 -->
 <property name="dist.example.dir" value="${dist.dir}/examples" />

 <!-- 测试用例源代码目录 -->
 <property name="dist.testcase.dir" value="${dist.dir}/test" />

 <!-- ===================================== -->

 <!-- 配置选项:如果构建时不需要,请注释掉 -->

 <!-- 复制jar包开关 -->
 <property name="switch.copyjar" value="" />

 <!-- 复制bin开关 -->
 <property name="switch.copybin" value="" />

 <!-- 复制etc配置文件开关 -->
 <property name="switch.copyetc" value="" />

 <!-- 复制jdbc驱动开关 -->
 <property name="switch.copyjdbc" value="" />

 <!-- 复制库文件开关 -->
 <property name="switch.copylib" value="" />

 <!-- 复制示例文件开关 -->
 <property name="switch.copyexample" value="" />

 <!-- 复制测试用例开关 -->
 <!--property name="switch.copytestcase" value="" /-->

 <!-- ======================================== -->

 <!-- JDBC驱动列表 -->
 <fileset id="jdbc.list" dir="${lib.dir}">
  <include name="**/*.jar" />
 </fileset>

 <!-- 外部库列表 -->
 <fileset id="lib.list" dir="${lib.dir}">
  <include name="**/*.jar" />
 </fileset>

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

 <!-- ========================================== -->

 <!-- java编译配置 -->
 <property name="javadoc" value="
http://java.sun.com/j2se/1.4/docs/api" />
 <property name="javac.debug" value="on" />
 <property name="javac.optimize" value="off" />
 <property name="javac.target" value="1.4" />
 <property name="javac.source" value="1.4" />
 <property name="javac.deprecation" value="on" />
 <property name="javac.compiler" value="modern" />

 <!-- ========================================= -->
 <!-- ====                                      -->
 <!-- ========================================= -->

 <filter token="year" value="${year}" />
 <filter token="version.full" value="${version.full}" />
 <filter token="date" value="${TODAY}" />
 <filter token="log" value="true" />
 <filter token="verbose" value="true" />

 <patternset id="jar.files">
  <include name="**/*.dtd" />
  <include name="**/*.xml" />
  <include name="**/*.xslt" />
 </patternset>

 <patternset id="src.files">
  <!-- include everything we want in the src directory
    that we didn't want in the jar itself -->
  <include name="**/*.java" />
 </patternset>

 <patternset id="refdoc.files">
  <include name="**/*.css" />
  <include name="**/*.jpg" />
  <include name="**/*.gif" />
  <include name="**/*.png" />
 </patternset>
 <!-- =============================================== -->
 <!-- ==== 使用帮助                                    -->
 <!-- =============================================== -->
 <target name="usage">
  <echo>${Name} Build file
-------------------------------------------------------------
available targets are:

jar  - generates the ${Name}.jar file

build - compiles the source code

javadoc - generates the API documentation

clean - cleans up the directory

dist - will create a complete distribution in dist
    Setting the env variable NO_JAVADOC will build the
    distribution without running the javadoc target.
   
release - will create a complete distribution in dist
    using stricter settings for public distribution.
   
Please rename build.properties.default to build.properties
and edit build.properties to specify JSDK 2.3 classpath.
  
See the comments inside the build.xml file for more details.
-------------------------------------------------------------</echo>
 </target>


 <!-- ============================================ -->
 <!-- ==== 构建                                    -->
 <!-- ============================================ -->

 <!-- ==== 创建API文档 ===========================  -->
 <target name="javadoc">
  <mkdir dir="${src.dir}" />
  <mkdir dir="${doc.api.dir}" />
  <javadoc sourcepath="${src.dir}" destdir="${doc.api.dir}" author="true" version="true" use="true" splitindex="true" windowtitle="${Name} API" doctitle="${Name}">
   <!-- link="${javadoc}"-->
   <classpath refid="classpath" />
   <packageset dir="${src.dir}" defaultexcludes="yes">
    <include name="**" />
   </packageset>
   <group title="Core API" packages="com.zjw.*" />
  </javadoc>
 </target>

 <!-- ==== 编译源代码 =============================  -->
 <target name="build">
  <mkdir dir="${src.dir}" />
  <mkdir dir="${class.dir}" />
  <javac srcdir="${src.dir}" destdir="${class.dir}" debug="${javac.debug}" optimize="${javac.optimize}">
   <classpath refid="classpath" />
  </javac>
 </target>

 <!-- ==== 创建jar包 ==============================  -->
 <target name="jar" depends="build">
  <mkdir dir="${lib.dir}" />
  <jar jarfile="${lib.dir}/${jar.file}" basedir="${class.dir}" includes="**" />
 </target>

 <!-- ==== 清理目标 ===============================  -->
 <target name="clean">
  <delete dir="${dist.dir}" />
 </target>

 <!-- ==== 清理全部目标 ===========================  -->
 <target name="clean-all">
  <delete dir="${class.dir}" />
  <delete dir="${doc.api.dir}" />
  <delete dir="${dist.root}" />
 </target>

 <!-- =========================================== -->
 <!-- ==== 构建发行版本                            -->
 <!-- =========================================== -->

 <!-- ==== 创建源代码 =======================  -->
 <target name="build-src">
  <mkdir dir="${dist.src.dir}" />
  <copy todir="${dist.src.dir}">
   <fileset dir="${src.dir}" />
  </copy>
 </target>

 <!-- ==== 创建项目文档 ==================  -->
 <target name="build-doc" depends="javadoc">
  <mkdir dir="${dist.doc.dir}" />
  <copy todir="${dist.doc.dir}">
   <fileset dir="${doc.dir}" />
  </copy>
 </target>

 <!-- ==== 创建jar包 =======================  -->
 <target name="build-jar" depends="jar" if="switch.copyjar">
  <mkdir dir="${dist.lib.dir}" />
  <copy file="${lib.dir}/${jar.file}" todir="${dist.lib.dir}" />
 </target>

 <!-- ==== 复制etc目录中配置文件 ============  -->
 <target name="build-etc" if="switch.copyetc">
  <mkdir dir="${etc.dir}" />
  <mkdir dir="${dist.etc.dir}" />
  <copy todir="${dist.etc.dir}">
   <fileset dir="${etc.dir}" />
  </copy>
 </target>

 <!-- ==== 复制bin目录中执行文件 ============  -->
 <target name="build-bin" if="switch.copybin">
  <mkdir dir="${bin.dir}" />
  <mkdir dir="${dist.bin.dir}" />
  <copy todir="${dist.bin.dir}">
   <fileset dir="${bin.dir}" />
  </copy>
 </target>

 <!-- ==== 复制jdbc驱动 ====================  -->
 <target name="build-jdbc" if="switch.copyjdbc">
  <mkdir dir="${jdbc.dir}" />
  <mkdir dir="${dist.jdbc.dir}" />
  <copy todir="${dist.jdbc.dir}">
   <fileset refid="jdbc.list" />
  </copy>
 </target>

 <!-- ==== 复制lib库文件 ====================  -->
 <target name="build-lib" if="switch.copylib">
  <mkdir dir="${lib.dir}" />
  <mkdir dir="${dist.lib.dir}" />
  <copy todir="${dist.lib.dir}">
   <fileset refid="lib.list" />
  </copy>
 </target>

 <!-- ==== 复制示例 ========================  -->
 <target name="build-example" if="switch.copyexample">
  <mkdir dir="${example.dir}" />
  <mkdir dir="${dist.example.dir}" />
  <copy todir="${dist.example.dir}">
   <fileset dir="${example.dir}" />
  </copy>
 </target>

 <!-- ==== 复制测试用例 ====================  -->
 <target name="build-testcase" if="switch.copytestcase">
  <mkdir dir="${testcase.dir}" />
  <mkdir dir="${dist.testcase.dir}" />
  <copy todir="${dist.testcase.dir}">
   <fileset dir="${testcase.dir}" />
  </copy>
 </target>

 <!-- ==== 构建发行版本 - 无javadoc ==========  -->
 <target name="dist" depends="build-src,build-jar,build-etc,build-bin,build-jdbc,build-lib,build-example,build-testcase">
  <echo message="${exedate} ${exetime}" />
  <!-- 复制ANT配置文件 -->
  <copy file="${buildfile}" todir="${dist.dir}" />
 </target>
 <!-- ==== 构建发行版本 ======================  -->
 <target name="release" depends="build-src,build-doc,build-jar,build-etc,build-bin,build-jdbc,build-lib,build-example,build-testcase">
  <echo message="${exedate} ${exetime}" />
  <!-- 复制ANT配置文件 -->
  <copy file="${buildfile}" todir="${dist.dir}" />
 </target>

 <!-- =========================================== -->
 <!-- ==== 扩展任务                                -->
 <!-- =========================================== -->

 <!-- ==== extension ==================  -->
 <target name="extension_task" />

</project>

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值