使用Ant制作发布版本

简介:
Ant的原名为Another neat tool,翻译过来为另外一个干净的工具,在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,并且任何人都可以通过双击一个命令来完成打包操作,使得打包不再成为技术总监的负担,简单,高效,准确,快捷是技术总监对这个打包脚本的最后评价。
下面介绍整个打包脚本的每一个部分
属性的设置部分:
  <property   name= "app.home"   value= "."   />
     <property   file= "build.properties"   />
     <property   name= "svn.repository.user"   value= "tianli"   />
     <property   name= "svn.repository.password"   value= "tianli"   />
     <property   name= "replace.token"   value= "88.1.16.100"   />
     <property   name= "replace.value"   value= "127.0.0.1"   />
 
     <property   name= "6ksoftsca.home"   value= "${app.home}/6ksoftsca"   />
     <property   name= "dist.home"   value= "${app.home}/dist"   />
     <property   name= "L_SCA3.home"   value= "${app.home}/../L_SCA3"   />
 
     <property   name= "src.home"   value= "${6ksoftsca.home}/src"   />
     <property   name= "classes.home"   value= "${6ksoftsca.home}/WebRoot/WEB-INF/classes"   />
 
     <!-- 必须 . 如果没有提示找不到 svn task  这个文件在 svnant.jar 文件中 , 只要把相应的 jar 文件放到 ANT_HOME 中就可以了  -->
     <taskdef   name= "svn"   classname= "org.tigris.subversion.svnant.SvnTask"   />
定义类的编译路径
         <path   id= "compile.path" >
        <pathelement   location= "${classes.home}"   />
        <fileset   dir= "${6ksoftsca.home}/WebRoot/WEB-INF/lib" >
            <include   name= "*.jar"   />
            <include   name= "*.zip"   />
        </fileset>
     </path>
  svn 检出最新的代码:
     <target   name= "export"   depends= "prepare"   description= "export all source data from Head revision" >
        <echo> 开始从  ${svn.repository.url}  检出源码 ... </echo>
        <svn   javahl= "false"   username= "${svn.repository.user}"   password= "${svn.repository.password}" >
            <!--checkout url="${svn.repository.url}" destPath="${build.home}"/-->
            <export   srcUrl= "${svn.repository.url}"   destPath= "${6ksoftsca.home}"   revision= "HEAD"   />
        </svn>
        <echo>  ${svn.repository.url}  检出源码成功 .... </echo>
     </target>
编译源代码:
<target   name= "compile"   description= "compile all src file"   depends= "export" >
        <mkdir   dir= "${classes.home}"   />
        <echo   message= " 正在编译源文件 ...."   />
        <javac   srcdir= "${src.home}"   destdir= "${classes.home}" >
            <classpath   refid= "compile.path"   />
        </javac>
        <echo   message= " 编译源文件成功 ...."   />
     </target>
 
准备复制的数据
<target   name= "build"   depends= "compileProduct"   description= "prepare to deploy" >
        <copy   todir= "${classes.home}" >
            <fileset   dir= "${product.home}" >
               <include   name= "**/*.properties"   />
               <include   name= "**/*.prop"   />
               <include   name= "**/*.xml"   />
            </fileset>
        </copy>
        <copy   todir= "${classes.home}/images" >
            <fileset   dir= "${images.home}"   />
        </copy>
        <copy   todir= "${classes.home}/icon" >
            <fileset   dir= "${icon.home}"   />
        </copy>
     </target>
构建 \ 处理   网站的文件
     <target   name= "build"   description= "build all files"   depends= "compile" >
        <echo   message= " 正在复制配置文件到 WEB-INF/classes...."   />
        <copy   todir= "${classes.home}" >
            <fileset   dir= "${src.home}" >
               <include   name= "*.dat"   />
               <include   name= "**/*.xml"   />
               <include   name= "*.properties"   />
               <include   name= "*.dll"   />
               <include   name= "*.txt"   />
            </fileset>
        </copy>
        <echo   message= " 正在复制 radio 文件夹的内容 ...."   />
        <copy   todir= "${6ksoftsca.home}/WebRoot/radio" >
            <fileset   dir= "${app.home}/radio"   />
        </copy>
        <echo   message= " 正在检查文件的内容 ...."   />
        <replace   file= "${classes.home}/config.xml"   token= "${replace.token}"   value= "${replace.value}"   />
        <replace   file= "${classes.home}/hibernate.cfg.xml"   token= "${replace.token}"   value= "${replace.value}"   />
        <replace   file= "${6ksoftsca.home}/WebRoot/report/design/common.rptlibrary"   token= "${replace.token}"   value= "${replace.value}"   />
     </target>
导出数据库
<target   name= "dataHandle"   depends= "build" >
        <echo   message= " 正在备份并清除 S_Systemdesc 的标志 ...."   />
        <exec   executable= "cmd" >
            <arg   value= "/c"   />
            <arg   value= "sqlplus sca/sca@${oracle_serviceName} @backupSystemFlag.sql"   />
        </exec>
        <echo   message= " 正在导出 S_Systemdesc 的数据 ...."   />
        <exec   executable= "cmd" >
            <arg   value= "/c"   />
            <arg   value= "exp sca/sca@${oracle_serviceName} file=sca.dmp"   />
        </exec>
 
        <echo   message= " 正在恢复 S_Systemdesc 的数据 ...."   />
        <exec   executable= "cmd" >
            <arg   value= "/c"   />
            <arg   value= "sqlplus sca/sca@${oracle_serviceName} @restoreSystemFlag.sql"   />
        </exec>
     </target>
移动文件并打包:
<target   name= "dist"   description= " 部署文件 "   depends= "dataHandle" >
        <echo   message= " 覆盖应用 ${classes.home}/lic.dat...."   />
        <delete   file= "${classes.home}/lic.dat"   />
        <copy   todir= "${classes.home}" >
            <fileset   dir= "${L_SCA3.home}/" >
               <include   name= "lic.dat"   />
            </fileset>
        </copy>
        <echo   message= " 移动 ${6ksoftsca.home}/WebRoot ${L_SCA3.home}/plats..."   />
        <move   todir= "${L_SCA3.home}/plats" >
            <fileset   dir= "${6ksoftsca.home}/WebRoot"   />
        </move>
        <echo   message= " 移动 sca.dmp...."   />
        <move   todir= "${L_SCA3.home}" >
            <fileset   dir= "${app.home}" >
                <include   name= "sca.dmp"   />
            </fileset>
        </move>
        <echo   message= " 开始打包 ..."   />
        <exec   executable= "package.bat"   />
        <move   todir= "${dist.home}" >
            <fileset   dir= "${L_SCA3.home}" >
               <include   name= "install_ALL.jar"   />
            </fileset>
        </move>
        <antcall   target= "clean"   />
     </target>
清除临时文件:
<target   name= "clean" >
        <echo   message= " 清除临时文件 ..."   />
        <echo   message= " 删除 ${L_SCA3.home}/sca.dmp...."   />
        <delete   file= "${L_SCA3.home}/sca.dmp"   />
        <echo   message= " 删除 ${L_SCA3.home}/plats..."   />
        <delete   dir= "${L_SCA3.home}/plats"   />
        <echo   message= " 删除 ${6ksoftsca.home} 文件夹 ..."   />
        <delete   dir= "${6ksoftsca.home}"   />
     </target>
以上是打包使用的所有脚本,相应的注释也比较多,如果有不清楚的地方欢迎垂询,如果您有更好的方法,欢迎批评指正。
作者简介:凌辉 北京****科技发展有限公司 物流 软件开发部 项目经理,数据库方向研究生学历,设计开发过多个J2EE应用程序,有丰富的软件开发、管理、测试经验,擅长网站应用程序开发,在设计模式,软件重构,版本控制,软件保护,数据库设计与管理等方面都有独特的见解。
联系方式:QQ21731278 msn[email]lili00okok123@hotmail.com[/email]
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/98040如需转载请自行联系原作者

lili00okok
相关文章
|
3月前
|
IDE 小程序 API
【社区每周】IDE 3.8.10 Beta 版新增按需编译功能(1月第四期)
【社区每周】IDE 3.8.10 Beta 版新增按需编译功能(1月第四期)
24 0
|
5月前
|
C++
打包qt发布
打包qt发布
18 0
|
7月前
Qt-做一个快速打包插件(一键完成项目软件打包)
Qt-做一个快速打包插件(一键完成项目软件打包)
|
存储 编解码 人工智能
cdr2023新功能发布介绍CorelDRAW
懂设计的职场人都知道这款软件,CorelDRAW是一款非常高效的矢量图形设计软件。CorelDRAW操作界面简洁易懂,能够为用户提供精确地创建物体的尺寸和位置的功能,减少点击步骤,提高设计效率,节省设计时间。功能比普通的美图之类的不要好太多!
466 0
|
安全 Devops
发布插件
发布插件
110 0
发布插件
|
Windows
FL STUDIO21软件最新版新主题、插件、功能介绍
大家常说的“DJ音乐”实际应该指的是EDM音乐,现在市面上的宿主软件几乎都可以制作EDM音乐。DJ音乐制作要学多久?可长可短,想要学精一门艺术和技术至少需要一两年时间。FL STUDIO21软件下载如下:http://t.csdn.cn/3irxK
138 2
|
Kubernetes Cloud Native 前端开发
如何从代码到制作并发布一个 Helm 包?
Helm 是什么?云原生领域应用打包和分发的事实标准,Helm Chart 通常包含 Docker 镜像及其基础设施配置,能够把一个 K8s 生态的应用完整封装,并且在另一个 K8s 环境正常的运行。为什么 Helm 会流行?核心功能有两点:对复杂的 Kubernetes YAML 做了打包和抽象,简化为少量参数。给出应用的概念,并给出了完整生命周期解决方案:制作、上传(托管)、版本化、分发、部署
如何从代码到制作并发布一个 Helm 包?
新版本坑太多,UI不适配惊呼受不了?快下载回老旧版本的IDEA!
新版本坑太多,UI不适配惊呼受不了?快下载回老旧版本的IDEA!
190 0
新版本坑太多,UI不适配惊呼受不了?快下载回老旧版本的IDEA!
|
弹性计算 前端开发 IDE
前端突破——IDE 插件发布 Visual Studio Code 新版本,一键打包部署,开发提速 8 倍
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。
3999 0
前端突破——IDE 插件发布 Visual Studio Code 新版本,一键打包部署,开发提速 8 倍
xal
|
Shell 开发工具 git
VSCode插件开发全攻略(十)打包、发布、升级
更多文章请戳[VSCode插件开发全攻略系列目录导航](https://www.atatech.org/articles/121864)。 # 发布方式 插件开发完了,如何发布出去分享给他人呢?主要有3种方法: * 方法一:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然后重启vscode,一般不推荐; * 方法二:打包成vsix插件,然后发送给别人安装,
xal
3175 0