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

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


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

<?xml version="1.0"?>
<!-- 从svn更新源代码,并重新编译、打包、部署 -->
<project name="auto-deploy" basedir="." default="redeploy">

	<!-- 属性定义(在不同的环境,应该要重新定义合适自己的属性值) -->
	
	<!-- 定义存放检出代码的目录 -->	
	<property name="checkout_dir" value="project1"/>
	<!-- 指明要检出的代码在svn服务器上的url -->	
	<property name="project_svn_url" value="https://xxx.com/svn/01 Code/project1/"/>
	<!-- 指明svn账号 -->	
	<property name="svn_repository_user" value="user1"/>
	<!-- 指明svn密码 -->	
	<property name="svn_repository_passwd" value="123456789"/>
	<!-- 指明tomcat的目录 -->
	<property name="tomcat_home" value="F:/company1/apache-tomcat-7.0.47"/>
	<!-- 指定打包后war文件的名称 -->
	<property name="war_name" value="project1"/>
	<!-- 指明svnant任务插件用到的jar文件的路径 -->
	<property name="svnant_lib" value="lib"/>
	<!-- 指明编译时需要用到的其他jar文件的路径 -->
	<property name="other_lib" value="3rd_lib"/>

	<!-- 当前时间及格式 -->
	<tstamp>
		<format property="current_time" pattern="yyyyMMddhhmm" locale="zh"/>
	</tstamp>

	<!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
	<path id="svnant_classpath">
		<fileset dir="${svnant_lib}">
			<include name="**/*.jar"/>
		</fileset>
	</path>  
	<!-- 项目的classpath路径 -->
	<path id="project_classpath">
		<fileset dir="${checkout_dir}/WebRoot/WEB-INF/lib/"> 
			<include name="*.jar"/>
		</fileset>
		<!-- 编译时额外需要javax.servlet.jar和javax.servlet.jsp.jar -->
		<fileset dir="${other_lib}">
			<include name="*.jar"/>
		</fileset>
	</path> 

	<!-- 引入svn任务 -->
	<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant_classpath" />
	<!-- 设置svn属性 -->
	<svnSetting id="svnparams" username="${svn_repository_user}" password="${svn_repository_passwd}" javahl="false"/> 

	<!-- 删除源代码文件夹 -->
	<target name="clean-src">
		<echo message="开始删除检出的源码(源码目录:${checkout_dir}),请稍后..." />
		<delete dir="${checkout_dir}"/>
		<echo message="源码删除完毕。" />
	</target>

	<!-- 从SVN服务器checkout源代码 -->
	<target name="checkout" depends="clean-src">
		<echo message="开始从svn服务器${project_svn_url}检出代码,请稍后..." /> 
		<svn refid="svnparams">
			<checkout url="${project_svn_url}" revision="HEAD" destPath="${checkout_dir}"  force="true"/>
		</svn>
		<echo message="从svn服务器${project_svn_url}检出代码完成。" />
	</target>
	
	<!-- 从SVN服务器update源代码 -->
	<target name="update">
		<echo message="开始从svn服务器${project_svn_url}更新代码,请稍后..." />
			<update revision="HEAD" dir="${checkout_dir}" />
		<echo message="从svn服务器${project_svn_url}更新代码完成。" />
	</target>

		<!-- 清除旧的编译文件 -->
	<target name="clean-class">
	<echo message="开始清空classes文件夹内之前编译生成的旧的类文件,请稍后..." />
		<delete dir="${checkout_dir}/WebRoot/WEB-INF/classes"/>
		<mkdir dir="${checkout_dir}/WebRoot/WEB-INF/classes"/>
		<echo message="classes文件清空完毕。" />

	</target>
	
	<!-- 编译源代码 -->
	<target name="compile" depends="checkout,clean-class">
		<echo message="开始编译源文件,请稍后..." /> 
		<javac nowarn="true" destdir="${checkout_dir}/WebRoot/WEB-INF/classes" source="1.5" target="1.5" debug="false"  
                  deprecation="false" optimize="false" failonerror="true">  
			<src path="${checkout_dir}/src"/>
			<classpath refid="project_classpath"/>
		</javac>  
	</target> 

	<!-- 复制配置文件 -->
	<target name="copy-config-files" depends="compile">
		<copy todir="${checkout_dir}/WebRoot/WEB-INF/classes/conf/">  
			<fileset dir="${checkout_dir}/src/conf/"/>
		</copy>
		<copy todir="${checkout_dir}/WebRoot/WEB-INF/classes/">  
			<fileset file="${checkout_dir}/src/log4j.properties"/>
		</copy>  		
	</target> 

	<!-- 生成war包 -->
	<target name="generate-war" depends="copy-config-files">
		<war warfile="./${war_name}.war" webxml="${checkout_dir}/WebRoot/WEB-INF/web.xml" excludes="*.svn">
			<lib dir="${checkout_dir}/WebRoot/WEB-INF/lib"/>
			<classes dir = "${checkout_dir}/WebRoot/WEB-INF/classes"/>
			<fileset dir="${checkout_dir}/WebRoot"/>
		</war>
	</target>

	<!-- 启动tomcat -->
	<target name="start-tomcat">
		<echo>开始启动tomcat,请稍后....</echo>
		<exec executable="${tomcat_home}/bin/startup.bat"  failonerror="false" 
					 vmlauncher="false"  output="${tomcat_home}/logs/log.txt" append="true">
			<!-- <arg value="/c" /> -->  
			<env key="CATALINA_HOME" path="${tomcat_home}"/>
			<arg value="/c startup.bat" />   
		</exec>
		<!-- 检测tomcat的URL是否可以访问成功,访问成功则认为tomcat启动完成 -->
		<waitfor maxwait="10" maxwaitunit="minute"  checkevery="1000">
			<http url="http://localhost:8080/"/>
		</waitfor>
		<echo>启动tomcat完成。</echo>
	</target>

	<!-- 停止tomcat,生成war文件成功才停止tomcat来部署 -->
	<target name="stop-tomcat" depends="generate-war">  
		<echo>开始停止tomcat,请稍后...</echo>  
		<exec executable="${tomcat_home}/bin/shutdown.bat"  failonerror="false"   
                    output="${tomcat_home}/logs/log.txt" append="true" >  
			<!-- <arg value="/c" /> -->     
			<env key="CATALINA_HOME" path="${tomcat_home}"/>  
			<arg value="/c shutdown.bat" />     
		</exec>
		<!-- 检测tomcat的URL是否访问失败(用not标签),访问失败则认为tomcat已经停止。 -->
		<waitfor maxwait="10" maxwaitunit="minute"  checkevery="1000">
			<not>
				<http url="http://localhost:8080/"/>
			</not>
		</waitfor>
		<echo>停止tomcat完成。</echo>
	</target> 

	<!-- 检查是否存在已经部署的旧的目标war包。 -->
	<target name="old-war-exist-check"> 
		<echo>检查是否存在旧的同名war文件...</echo>
		<available file="${tomcat_home}/webapps/${war_name}.war"  property="old-war-isexist"/>
	</target>

	<!-- 重新部署前,备份原来的war文件。 -->
	<target name="backup-old-war" depends="old-war-exist-check"  if="old-war-isexist">

		<echo>存在旧的同名war文件,开始备份之前部署的旧的同名war文件...</echo>
		<copy tofile="./${war_name}_bak${current_time}.war">  
			<fileset file="${tomcat_home}/webapps/${war_name}.war"/>
		</copy> 
		<echo>备份旧的同名war文件完毕。</echo>
	</target>		

	<!-- 删除原来的war文件 -->
	<target name="delete-old-war" depends="backup-old-war" if="old-war-isexist">
		<echo>开始删除旧的同名war文件...</echo>
		<delete file="${tomcat_home}/webapps/${war_name}.war"/>		 
		<echo>删除旧的同名war文件完毕。</echo>
	</target>



	<!-- 检查是否存在已经部署的目标context文件夹。 -->
	<target name="old-context-exist-check"> 
		<echo>检查是否存在旧的同名context文件夹...</echo>
		<available file="${tomcat_home}/webapps/${war_name}" type="dir"  property="old-context-isexist"/>
	</target>

	<!-- 删除旧的目标context文件夹 -->
	<target name="delete-old-context" depends="old-context-exist-check" if="old-context-isexist">
		<echo>存在旧的同名context文件夹,开始删除旧的同名context文件夹...</echo>
		<delete dir="${tomcat_home}/webapps/${war_name}"/> 
		<echo>删除旧的同名context文件夹完毕。</echo>
	</target>



	<!-- 把新打包的war文件复制到tomcat的webapps目录下 -->
	<target name="copy-new-war-into-webapps" depends="delete-old-context,delete-old-war">
		<echo>开始复制新的war文件到tomcat的webapps目录下,请稍后...</echo>
		<copy tofile="${tomcat_home}/webapps/${war_name}.war">  
			<fileset file="./${war_name}.war"/>
		</copy> 		 
		<echo>复制新的war文件到tomcat的webapps目录下完毕。</echo>
	</target>
	
	
	<!-- 部署,主要是执行依赖任务 -->
	<target name="redeploy" depends="stop-tomcat,copy-new-war-into-webapps,start-tomcat">
		<echo>部署完毕,请测试是否部署成功。</echo>
	</target>
	
</project>

此外注意几点:

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


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


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

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


ant全自动更新部署web程序的详解,布布扣,bubuko.com

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

上一篇:php生成随机密码的三种方法


下一篇:Fluid Shopping Website 开发阶段性总结——第一周