【准备】
1、下载并解压ANT;
2、下载并解压命令行SVN。
ANT下载:http://ant.apache.org/bindownload.cgi
SVN下载:https://www.visualsvn.com/downloads/
【配置】
分别把ANT和SVN命令添加到path路径。
【编写build.xml】
思路:考虑到windows环境下执行远程命令比较麻烦,所以可以考虑在windows服务器上执行ant命令实现自动化部署。
1、创建临时目录,与目标部署文件目录一致,用于最终覆盖部署使用;
2、通过SVN命令,导出干净的java源代码;
3、编译源代码,生成class文件;
4、复制class文件和非java文件至临时目录(到这里,待部署文件已准备就绪);
5、停止服务。
6、备份【待更新部署的目标服务器文件和目录】;
7、删除【待更新部署的目标服务器文件和目录】;
8、复制临时目录文件至【待更新部署的目标服务器文件和目录】;
9、删除临时目录。
10、重启服务。
build.xml
<?xml version="1.0"?>
<project name="attendance" default="startserver" basedir=".">
<tstamp><format property="today" pattern="yyyyMMdd"/></tstamp>
<property environment="env" />
<property name="jdbc" value="jdbc.properties"/>
<property name="project.dir" value="trunk"/>
<property name="webapp.dir" value="${project.dir}/WebContent"/>
<property name="classes.dir" value="${webapp.dir}/WEB-INF/classes"/>
<property name="lib.dir" value="${webapp.dir}/WEB-INF/lib"/>
<property name="java.jre.lib.dir" value="${env.JAVA_HOME}/jre/lib" />
<property name="tomcat.lib.dir" value="${env.CATALINA_HOME}/lib" />
<property name="server.root.dir" value="D:\apache-tomcat-8.0.39\webapps\ROOT" />
<property name="backup.target.dir" value="D:\backup\attendance\${today}" />
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
<!-- 指定编译class依赖的jar包 -->
<path id="project.class.path">
<fileset dir="${java.jre.lib.dir}">
<include name="**/*.jar" />
</fileset>
<fileset file="${tomcat.lib.dir}/*.jar" />
<fileset file="${lib.dir}/*.jar" />
</path>
<mkdir dir="logs"/>
<!-- 输出执行日志 -->
<record name="logs/ant_log_${today}.log" loglevel="info" append="no" action="start"/>
<!-- 清理classes目录-->
<target name="clean">
<delete dir="${project.dir}"/>
</target>
<!-- export-->
<target name="export" depends="clean">
<exec executable="cmd.exe" failοnerrοr="true">
<arg line="/c svn export https://10.1.1.100/svn/source/attendance/trunk"/>
</exec>
</target>
<!-- 建立classes目录,并编译java源文件到classes目录-->
<target name="compile" depends="export">
<echo message="compling to ${classes.dir}"/>
<mkdir dir="${classes.dir}"/>
<copy todir="${classes.dir}">
<fileset dir="${project.dir}/resource">
<include name="**/*" />
</fileset>
<fileset dir="${project.dir}/src">
<exclude name="**/*.java" />
</fileset>
</copy>
<copy tofile="${webapp.dir}/WEB-INF/config/jdbc.properties" file="${jdbc}"/>
<javac srcdir="${project.dir}/src" destdir="${classes.dir}" source="1.8" target="1.8" encoding="UTF-8" debug="on" debuglevel="lines,vars,source" fork="true" nowarn="on" optimize="on" includeantruntime="false">
<!-- -XDignore.symbol.file解决找不到部分rt.jar中部分类的问题 -->
<!-- -encoding UTF-8解决编码问题(encoding="UTF-8"属性配置可以解决同样的问题) -->
<compilerarg line="-encoding UTF-8 -XDignore.symbol.file"/>
<!-- 指定依赖的jar包,classpath -->
<classpath refid="project.class.path" />
</javac>
</target>
<target name="stopserver" depends="compile">
<exec executable="cmd.exe" failοnerrοr="true">
<arg line="/c net stop Tomcat8"/>
</exec>
</target>
<target name="backup" depends="stopserver">
<echo message="backuping from ${server.root.dir} to ${backup.target.dir}"/>
<delete dir="${backup.target.dir}"/>
<mkdir dir="${backup.target.dir}"/>
<copy todir="${backup.target.dir}">
<fileset dir="${server.root.dir}">
<include name="**/*" />
</fileset>
</copy>
</target>
<target name="remove" depends="backup">
<echo message="removing from ${server.root.dir}"/>
<!-- <delete verbose="true" includeemptydirs="true">
<fileset dir="${server.root.dir}">
<include name="**/*"/>
</fileset>
</delete> -->
<delete dir="${server.root.dir}" failοnerrοr="true"/>
</target>
<target name="deploy" depends="remove">
<echo message="deploying from ${webapp.dir} to ${server.root.dir}"/>
<mkdir dir="${server.root.dir}"/>
<copy todir="${server.root.dir}">
<fileset dir="${webapp.dir}">
<include name="**/*" />
</fileset>
</copy>
<delete dir="${project.dir}"/>
</target>
<target name="startserver" depends="deploy">
<exec executable="cmd.exe" failοnerrοr="true">
<arg line="/c net start Tomcat8"/>
</exec>
</target>
</project>
【执行】
把ANT命令保存为BAT文件,以后需要更新部署时,直接双击执行即可。
@echo off
ant -buildfile build.xml
pause
【注意点】
1、通过Shell调用,Windows必须加 /c,Unix则是加 –c。
2、failonerror 缺省为false,即该命令执行了但是失败了,build仍然继续。
3、编译源代码的classpath需要指定包括jdk的lib包路径;
4、待编译源代码中有中文字符时,需要指定编码格式。
5、ant默认逐条阻塞式执行指令,如果想要并行执行一些指令时,可以使用<parallel>标签。
【附录】
ANT官方WIKI:https://wiki.apache.org/ant/FrontPage
官方文档有示例,但貌似没有详细API说明,所以对于一些命令的使用也可以参考阅读下BAIDU文章。
参考阅读1:http://www.cnblogs.com/halfacre/archive/2012/11/07/2758865.html
参考阅读2:http://cyf0110.iteye.com/blog/1507909
参考阅读3:http://ku-sunny.iteye.com/blog/966011
参考阅读4:http://blog.csdn.net/buptdavid/article/details/4854981