ant全自动更新部署web程序的详解

由于每次部署花费的时间都比较多:要从svn服务器更新代码,修改配置文件、甚至还要解决文件冲突,再打包,再上传到服务器端(网上不给力),然后还要停掉tomcat应用服务器,部署好包之后还要重启应用服务器。于是就用ant结合svnant插件写了一个自动更新部署的ant配置文件来解决。配置好之后,只需要在服务器输入一个简单的命令:“ant”,就可以实现全自动更新并重新部署web程序了。


示例配置文件如下:build.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0"?>  
  2. <!-- 从svn更新源代码,并重新编译、打包、部署 -->  
  3. <project name="auto-deploy" basedir="." default="redeploy">  
  4.   
  5.     <!-- 属性定义(在不同的环境,应该要重新定义合适自己的属性值) -->  
  6.       
  7.     <!-- 定义存放检出代码的目录 -->    
  8.     <property name="checkout_dir" value="project1"/>  
  9.     <!-- 指明要检出的代码在svn服务器上的url -->   
  10.     <property name="project_svn_url" value="https://xxx.com/svn/01 Code/project1/"/>  
  11.     <!-- 指明svn账号 -->    
  12.     <property name="svn_repository_user" value="user1"/>  
  13.     <!-- 指明svn密码 -->    
  14.     <property name="svn_repository_passwd" value="123456789"/>  
  15.     <!-- 指明tomcat的目录 -->  
  16.     <property name="tomcat_home" value="F:/company1/apache-tomcat-7.0.47"/>  
  17.     <!-- 指定打包后war文件的名称 -->  
  18.     <property name="war_name" value="project1"/>  
  19.     <!-- 指明svnant任务插件用到的jar文件的路径 -->  
  20.     <property name="svnant_lib" value="lib"/>  
  21.     <!-- 指明编译时需要用到的其他jar文件的路径 -->  
  22.     <property name="other_lib" value="3rd_lib"/>  
  23.   
  24.     <!-- 当前时间及格式 -->  
  25.     <tstamp>  
  26.         <format property="current_time" pattern="yyyyMMddhhmm" locale="zh"/>  
  27.     </tstamp>  
  28.   
  29.     <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->  
  30.     <path id="svnant_classpath">  
  31.         <fileset dir="${svnant_lib}">  
  32.             <include name="**/*.jar"/>  
  33.         </fileset>  
  34.     </path>    
  35.     <!-- 项目的classpath路径 -->  
  36.     <path id="project_classpath">  
  37.         <fileset dir="${checkout_dir}/WebRoot/WEB-INF/lib/">   
  38.             <include name="*.jar"/>  
  39.         </fileset>  
  40.         <!-- 编译时额外需要javax.servlet.jar和javax.servlet.jsp.jar -->  
  41.         <fileset dir="${other_lib}">  
  42.             <include name="*.jar"/>  
  43.         </fileset>  
  44.     </path>   
  45.   
  46.     <!-- 引入svn任务 -->  
  47.     <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant_classpath" />  
  48.     <!-- 设置svn属性 -->  
  49.     <svnSetting id="svnparams" username="${svn_repository_user}" password="${svn_repository_passwd}" javahl="false"/>   
  50.   
  51.     <!-- 删除源代码文件夹 -->  
  52.     <target name="clean-src">  
  53.         <echo message="开始删除检出的源码(源码目录:${checkout_dir}),请稍后..." />  
  54.         <delete dir="${checkout_dir}"/>  
  55.         <echo message="源码删除完毕。" />  
  56.     </target>  
  57.   
  58.     <!-- 从SVN服务器checkout源代码 -->  
  59.     <target name="checkout" depends="clean-src">  
  60.         <echo message="开始从svn服务器${project_svn_url}检出代码,请稍后..." />   
  61.         <svn refid="svnparams">  
  62.             <checkout url="${project_svn_url}" revision="HEAD" destPath="${checkout_dir}"  force="true"/>  
  63.         </svn>  
  64.         <echo message="从svn服务器${project_svn_url}检出代码完成。" />  
  65.     </target>  
  66.       
  67.     <!-- 从SVN服务器update源代码 -->  
  68.     <target name="update">  
  69.         <echo message="开始从svn服务器${project_svn_url}更新代码,请稍后..." />  
  70.             <update revision="HEAD" dir="${checkout_dir}" />  
  71.         <echo message="从svn服务器${project_svn_url}更新代码完成。" />  
  72.     </target>  
  73.   
  74.         <!-- 清除旧的编译文件 -->  
  75.     <target name="clean-class">  
  76.     <echo message="开始清空classes文件夹内之前编译生成的旧的类文件,请稍后..." />  
  77.         <delete dir="${checkout_dir}/WebRoot/WEB-INF/classes"/>  
  78.         <mkdir dir="${checkout_dir}/WebRoot/WEB-INF/classes"/>  
  79.         <echo message="classes文件清空完毕。" />  
  80.   
  81.     </target>  
  82.       
  83.     <!-- 编译源代码 -->  
  84.     <target name="compile" depends="checkout,clean-class">  
  85.         <echo message="开始编译源文件,请稍后..." />   
  86.         <javac nowarn="true" destdir="${checkout_dir}/WebRoot/WEB-INF/classes" source="1.5" target="1.5" debug="false"    
  87.                   deprecation="false" optimize="false" failonerror="true">    
  88.             <src path="${checkout_dir}/src"/>  
  89.             <classpath refid="project_classpath"/>  
  90.         </javac>    
  91.     </target>   
  92.   
  93.     <!-- 复制配置文件 -->  
  94.     <target name="copy-config-files" depends="compile">  
  95.         <copy todir="${checkout_dir}/WebRoot/WEB-INF/classes/conf/">    
  96.             <fileset dir="${checkout_dir}/src/conf/"/>  
  97.         </copy>  
  98.         <copy todir="${checkout_dir}/WebRoot/WEB-INF/classes/">    
  99.             <fileset file="${checkout_dir}/src/log4j.properties"/>  
  100.         </copy>         
  101.     </target>   
  102.   
  103.     <!-- 生成war包 -->  
  104.     <target name="generate-war" depends="copy-config-files">  
  105.         <war warfile="./${war_name}.war" webxml="${checkout_dir}/WebRoot/WEB-INF/web.xml" excludes="*.svn">  
  106.             <lib dir="${checkout_dir}/WebRoot/WEB-INF/lib"/>  
  107.             <classes dir = "${checkout_dir}/WebRoot/WEB-INF/classes"/>  
  108.             <fileset dir="${checkout_dir}/WebRoot"/>  
  109.         </war>  
  110.     </target>  
  111.   
  112.     <!-- 启动tomcat -->  
  113.     <target name="start-tomcat">  
  114.         <echo>开始启动tomcat,请稍后....</echo>  
  115.         <exec executable="${tomcat_home}/bin/startup.bat"  failonerror="false"   
  116.                      vmlauncher="false"  output="${tomcat_home}/logs/log.txt" append="true">  
  117.             <!-- <arg value="/c" /> -->    
  118.             <env key="CATALINA_HOME" path="${tomcat_home}"/>  
  119.             <arg value="/c startup.bat" />     
  120.         </exec>  
  121.         <!-- 检测tomcat的URL是否可以访问成功,访问成功则认为tomcat启动完成 -->  
  122.         <waitfor maxwait="10" maxwaitunit="minute"  checkevery="1000">  
  123.             <http url="http://localhost:8080/"/>  
  124.         </waitfor>  
  125.         <echo>启动tomcat完成。</echo>  
  126.     </target>  
  127.   
  128.     <!-- 停止tomcat,生成war文件成功才停止tomcat来部署 -->  
  129.     <target name="stop-tomcat" depends="generate-war">    
  130.         <echo>开始停止tomcat,请稍后...</echo>    
  131.         <exec executable="${tomcat_home}/bin/shutdown.bat"  failonerror="false"     
  132.                     output="${tomcat_home}/logs/log.txt" append="true" >    
  133.             <!-- <arg value="/c" /> -->       
  134.             <env key="CATALINA_HOME" path="${tomcat_home}"/>    
  135.             <arg value="/c shutdown.bat" />       
  136.         </exec>  
  137.         <!-- 检测tomcat的URL是否访问失败(用not标签),访问失败则认为tomcat已经停止。 -->  
  138.         <waitfor maxwait="10" maxwaitunit="minute"  checkevery="1000">  
  139.             <not>  
  140.                 <http url="http://localhost:8080/"/>  
  141.             </not>  
  142.         </waitfor>  
  143.         <echo>停止tomcat完成。</echo>  
  144.     </target>   
  145.   
  146.     <!-- 检查是否存在已经部署的旧的目标war包。 -->  
  147.     <target name="old-war-exist-check">   
  148.         <echo>检查是否存在旧的同名war文件...</echo>  
  149.         <available file="${tomcat_home}/webapps/${war_name}.war"  property="old-war-isexist"/>  
  150.     </target>  
  151.   
  152.     <!-- 重新部署前,备份原来的war文件。 -->  
  153.     <target name="backup-old-war" depends="old-war-exist-check"  if="old-war-isexist">  
  154.   
  155.         <echo>存在旧的同名war文件,开始备份之前部署的旧的同名war文件...</echo>  
  156.         <copy tofile="./${war_name}_bak${current_time}.war">    
  157.             <fileset file="${tomcat_home}/webapps/${war_name}.war"/>  
  158.         </copy>   
  159.         <echo>备份旧的同名war文件完毕。</echo>  
  160.     </target>       
  161.   
  162.     <!-- 删除原来的war文件 -->  
  163.     <target name="delete-old-war" depends="backup-old-war" if="old-war-isexist">  
  164.         <echo>开始删除旧的同名war文件...</echo>  
  165.         <delete file="${tomcat_home}/webapps/${war_name}.war"/>          
  166.         <echo>删除旧的同名war文件完毕。</echo>  
  167.     </target>  
  168.   
  169.   
  170.   
  171.     <!-- 检查是否存在已经部署的目标context文件夹。 -->  
  172.     <target name="old-context-exist-check">   
  173.         <echo>检查是否存在旧的同名context文件夹...</echo>  
  174.         <available file="${tomcat_home}/webapps/${war_name}" type="dir"  property="old-context-isexist"/>  
  175.     </target>  
  176.   
  177.     <!-- 删除旧的目标context文件夹 -->  
  178.     <target name="delete-old-context" depends="old-context-exist-check" if="old-context-isexist">  
  179.         <echo>存在旧的同名context文件夹,开始删除旧的同名context文件夹...</echo>  
  180.         <delete dir="${tomcat_home}/webapps/${war_name}"/>   
  181.         <echo>删除旧的同名context文件夹完毕。</echo>  
  182.     </target>  
  183.   
  184.   
  185.   
  186.     <!-- 把新打包的war文件复制到tomcat的webapps目录下 -->  
  187.     <target name="copy-new-war-into-webapps" depends="delete-old-context,delete-old-war">  
  188.         <echo>开始复制新的war文件到tomcat的webapps目录下,请稍后...</echo>  
  189.         <copy tofile="${tomcat_home}/webapps/${war_name}.war">    
  190.             <fileset file="./${war_name}.war"/>  
  191.         </copy>          
  192.         <echo>复制新的war文件到tomcat的webapps目录下完毕。</echo>  
  193.     </target>  
  194.       
  195.       
  196.     <!-- 部署,主要是执行依赖任务 -->  
  197.     <target name="redeploy" depends="stop-tomcat,copy-new-war-into-webapps,start-tomcat">  
  198.         <echo>部署完毕,请测试是否部署成功。</echo>  
  199.     </target>  
  200.       
  201. </project>  

此外注意几点:

1、已经配置好Ant的环境变量。


2、从svn上更新下来的配置文件(例如配置数据库的db.properties)可能会被其他人修改,为了保证配置文件的正确性,最好是自己准备一份正确的配置文件,等项目checkout完毕后,用自己的配置文件覆盖掉从svn上更新下来的配置文件。


3、目前的配置是每次都从svn服务器上checkout或export整个项目,这会浪费很多时间,svnant配置update的没配置成功,还要继续研究。

4、这是自己第一次写ant的配置文件,可能写得不太合理,应该还有很多改进的空间。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值