ant部署

Ant的原名为Anotherneattool,翻译过来为另外一个干净的工具,在Java程序的开发中,ant是一个极好的助手。Ant使用XML格式的文件作为其运行的脚本,xml已经被大多数组织承认为通用的数据交换协议,具有容易阅读,编写,修改等良好的特性,被大多数人所接受。Ant运行的XML脚本文件中的每个元素都代表一个动作,ant通过动作调用相应的程序来执行任务,完成用户的操作。执行命令是ant的基本目标,把完成一项任务所需的命令按照正常的顺序写入ant脚本文件,ant调用脚本顺序执行,便可以完成一项大的任务。脚本具有一次完成编写,多次使用的特性,适合可重复的,顺序完成的任务。本篇文章的目的是讲述如何根据ant的特性和优点、结合实际的项目节约时间和成本的一个例子。

项目的来源,某个下午,公司经过两个月的bug修改(主要的工作不是修改,有空就修改),所有已经提交到bug库的bug都已经处理,版本的发布也到了最后期限,在查看了所有已经修改的bug并督促提交bug的人员进行检察之后,作者向技术总监提出构建一个新的版本,经过技术总监的批准,作者督促开发人员把所有的修改都提交到版本控制系统svn中,团队进行短暂的休息。在这个期间,把svn中的最新内容复制到发布分支中(关于svn的使用,以后会写出来)。程序打包前的准备工作已经完毕,作者向技术总监提出,可以制作发布版本了。技术总监便开始打包,下面是打包的步骤:

1.从SVN中取出最新的版本,

2.编译源文件,到web-inf/classes中

3.把源文件夹中包含的.txt,.xml,.dat,.dll,.properties中所有文件复制到classes中相应得位置

4.把其他的radio文件复制到webroot中

5.替换配置文件中的IP地址为127.0.0.1

到此为止所有的可以运行的jsp已经准备完毕,下面需要处理数据库部分,数据部分需要把数据库中的一个表中的字段的内容全部清0,以特定身份导出为特定的文件名,再恢复数据库中的某个字段的所有值。技术总监告诉我,以前的做法是导出这个表,执行update命令修改标志,导出数据,删除表,最后导入表。整个过程需要进行数据的导入导出,作者感觉比较麻烦,考虑到oracle数据库有一种创建表的方法是类似创建,可以在导出之前类似创建这个表BACK,从源表选择数据插入到back中,导出所有的数据,截断源表,从back表中选择数据插入到源表,毕竟在数据库中的操作要快一点。

当所有的数据都准备好之后,便可以通过运行打包命令进行打包了,打包的程序使用网上免费的基于java的izpack程序,该打包程序的使用也很简单,把需要的文件复制到相应的位置,运行它的命令便可以得到一个jar文件,在有jre的环境中双击就可以完成程序的安装,这个步骤在此不作介绍。打包的程序需要运行多次,一个好的做法是每次打包完毕,就把打包过程中生成的文件删除掉,除了最终的压缩包,因此在脚本程序的结束部分需要进行清理,删除所有的临时文件。

整个打包过程可以在无人值守的情况下完成打包工作,并且不容易出现错误,总共需要10分钟的时间,。以前打包都是人工完成,并且只有技术总监能记得所有的步骤,每次打包都需要30-60分钟,如果遗漏了什么,时间会更长。把ant打包脚本部署在一台比较陈旧的机器上运行即可完成任务,节省了资源、提高了工作效率,减少了出错的概率,大包花费的时间减少到0,并且任何人都可以通过双击一个命令来完成打包操作,使得打包不再成为技术总监的负担,简单,高效,准确,快捷是技术总监对这个打包脚本的最后评价。

下面介绍整个打包脚本的每一个部分

属性的设置部分:

<propertyname="app.home"value="."/>

<propertyfile="build.properties"/>

<propertyname="svn.repository.user"value="tianli"/>

<propertyname="svn.repository.password"value="tianli"/>

<propertyname="replace.token"value="88.1.16.100"/>

<propertyname="replace.value"value="127.0.0.1"/>

<propertyname="6ksoftsca.home"value="${app.home}/6ksoftsca"/>

<propertyname="dist.home"value="${app.home}/dist"/>

<propertyname="L_SCA3.home"value="${app.home}/../L_SCA3"/>

<propertyname="src.home"value="${6ksoftsca.home}/src"/>

<propertyname="classes.home"value="${6ksoftsca.home}/WebRoot/WEB-INF/classes"/>

<!--必须.如果没有提示找不到svntask这个文件在svnant.jar文件中,只要把相应的jar文件放到ANT_HOME中就可以了-->

<taskdefname="svn"classname="org.tigris.subversion.svnant.SvnTask"/>

定义类的编译路径

<pathid="compile.path">

<pathelementlocation="${classes.home}"/>

<filesetdir="${6ksoftsca.home}/WebRoot/WEB-INF/lib">

<includename="*.jar"/>

<includename="*.zip"/>

</fileset>

</path>

从svn检出最新的代码:

<targetname="export"depends="prepare"description="exportallsourcedatafromHeadrevision">

<echo>开始从${svn.repository.url}检出源码...</echo>

<svnjavahl="false"username="${svn.repository.user}"password="${svn.repository.password}">

<!--checkouturl="${svn.repository.url}"destPath="${build.home}"/-->

<exportsrcUrl="${svn.repository.url}"destPath="${6ksoftsca.home}"revision="HEAD"/>

</svn>

<echo>从${svn.repository.url}检出源码成功....</echo>

</target>

编译源代码:

<targetname="compile"description="compileallsrcfile"depends="export">

<mkdirdir="${classes.home}"/>

<echomessage="正在编译源文件...."/>

<javacsrcdir="${src.home}"destdir="${classes.home}">

<classpathrefid="compile.path"/>

</javac>

<echomessage="编译源文件成功...."/>

</target>

准备复制的数据

<targetname="build"depends="compileProduct"description="preparetodeploy">

<copytodir="${classes.home}">

<filesetdir="${product.home}">

<includename="**/*.properties"/>

<includename="**/*.prop"/>

<includename="**/*.xml"/>

</fileset>

</copy>

<copytodir="${classes.home}/images">

<filesetdir="${images.home}"/>

</copy>

<copytodir="${classes.home}/icon">

<filesetdir="${icon.home}"/>

</copy>

</target>

构建\处理网站的文件

<targetname="build"description="buildallfiles"depends="compile">

<echomessage="正在复制配置文件到WEB-INF/classes...."/>

<copytodir="${classes.home}">

<filesetdir="${src.home}">

<includename="*.dat"/>

<includename="**/*.xml"/>

<includename="*.properties"/>

<includename="*.dll"/>

<includename="*.txt"/>

</fileset>

</copy>

<echomessage="正在复制radio文件夹的内容...."/>

<copytodir="${6ksoftsca.home}/WebRoot/radio">

<filesetdir="${app.home}/radio"/>

</copy>

<echomessage="正在检查文件的内容...."/>

<replacefile="${classes.home}/config.xml"token="${replace.token}"value="${replace.value}"/>

<replacefile="${classes.home}/hibernate.cfg.xml"token="${replace.token}"value="${replace.value}"/>

<replacefile="${6ksoftsca.home}/WebRoot/report/design/common.rptlibrary"token="${replace.token}"value="${replace.value}"/>

</target>

导出数据库

<targetname="dataHandle"depends="build">

<echomessage="正在备份并清除S_Systemdesc的标志...."/>

<execexecutable="cmd">

<argvalue="/c"/>

<argvalue="sqlplussca/sca@${oracle_serviceName}@backupSystemFlag.sql"/>

</exec>

<echomessage="正在导出S_Systemdesc的数据...."/>

<execexecutable="cmd">

<argvalue="/c"/>

<argvalue="expsca/sca@${oracle_serviceName}file=sca.dmp"/>

</exec>

<echomessage="正在恢复S_Systemdesc的数据...."/>

<execexecutable="cmd">

<argvalue="/c"/>

<argvalue="sqlplussca/sca@${oracle_serviceName}@restoreSystemFlag.sql"/>

</exec>

</target>

移动文件并打包:

<targetname="dist"description="部署文件"depends="dataHandle">

<echomessage="覆盖应用${classes.home}/lic.dat...."/>

<deletefile="${classes.home}/lic.dat"/>

<copytodir="${classes.home}">

<filesetdir="${L_SCA3.home}/">

<includename="lic.dat"/>

</fileset>

</copy>

<echomessage="移动${6ksoftsca.home}/WebRoot到${L_SCA3.home}/plats..."/>

<movetodir="${L_SCA3.home}/plats">

<filesetdir="${6ksoftsca.home}/WebRoot"/>

</move>

<echomessage="移动sca.dmp...."/>

<movetodir="${L_SCA3.home}">

<filesetdir="${app.home}">

<includename="sca.dmp"/>

</fileset>

</move>

<echomessage="开始打包..."/>

<execexecutable="package.bat"/>

<movetodir="${dist.home}">

<filesetdir="${L_SCA3.home}">

<includename="install_ALL.jar"/>

</fileset>

</move>

<antcalltarget="clean"/>

</target>

清除临时文件:

<targetname="clean">

<echomessage="清除临时文件..."/>

<echomessage="删除${L_SCA3.home}/sca.dmp...."/>

<deletefile="${L_SCA3.home}/sca.dmp"/>

<echomessage="删除${L_SCA3.home}/plats..."/>

<deletedir="${L_SCA3.home}/plats"/>

<echomessage="删除${6ksoftsca.home}文件夹..."/>

<deletedir="${6ksoftsca.home}"/>

</target>

以上是打包使用的所有脚本,相应的注释也比较多,如果有不清楚的地方欢迎垂询,如果您有更好的方法,欢迎批评指正。

作者简介:凌辉北京****科技发展有限公司物流软件开发部项目经理,数据库方向研究生学历,设计开发过多个J2EE应用程序,有丰富的软件开发、管理、测试经验,擅长网站应用程序开发,在设计模式,软件重构,版本控制,软件保护,数据库设计与管理等方面都有独特的见解。

转自http://tianli.blog.51cto.com/190322/98040

相关推荐