最近公司需要每天构建一个版本提交到SVN服务器,于是就想写一个定时任务,每天定时自动完成。大致思路是利用Ant,先更新代码,然后编译打包,最后将打包文件提交到SVN服务器。其中编译和打包任务可以利用Ant提供的任务完成,但是更新和提交SVN需要集成SVN客户端功能。
(1)下载安装Ant,Ant下载地址:http://www.apache.org/dist/ant/binaries/apache-ant-1.8.2-bin.zip。下载完后,无需安装,只需要将压缩包解压缩到一个指定目录,如C盘根目录。然后配置环境变量ANT_HOME=C:\apache-ant-1.8.2, 将%ANT_HOME%\BIN加入到Path变量。
(2)下载SVNKit,下载后解压缩,将svnkit.jar和svnkit-cli.jar文件拷贝到构建目录(如D:\build)下的子目录antlib目录下。
说明:具体build.xml文件的写法,详细请参考Ant自带的相关文档
3. 编写批处理文件build.bat
ant -f D:\build\build.xml
说明:这里使用绝对地址,是为了方便定时任务调用
4. 将build.bat添加到Windows的任务计划,大功搞成。
注意:在编译的时候,如果提示找不到类HttpServletRequest等类似问题时,需要将jsp-api.jar和servlet-api.jar文件加入到classpath
这里介绍一种实现方法,借助SVNKit来完成。SVNKit是一个纯Java的SVN 客户端库,使用SVNKit无需安装任何SVN的客户端,支持各种操作系统。
1. 准备工作(1)下载安装Ant,Ant下载地址:http://www.apache.org/dist/ant/binaries/apache-ant-1.8.2-bin.zip。下载完后,无需安装,只需要将压缩包解压缩到一个指定目录,如C盘根目录。然后配置环境变量ANT_HOME=C:\apache-ant-1.8.2, 将%ANT_HOME%\BIN加入到Path变量。
(2)下载SVNKit,下载后解压缩,将svnkit.jar和svnkit-cli.jar文件拷贝到构建目录(如D:\build)下的子目录antlib目录下。
2. 编写build.xml文件
<?xml version="1.0" encoding="gb2312"?>
<project basedir="." name="myProject" default="svnCommit">
<!-- 构建相关属性 -->
<property name="dir.build" value="${basedir}\myProject"/>
<property name="dir.src" value="${dir.build}\src"/>
<property name="dir.web" value="${dir.build}\WebRoot"/>
<property name="dir.lib" value="${dir.web}\WEB-INF\lib"/>
<property name="dir.classes" value="${dir.web}\WEB-INF\classes" />
<!-- SVN相关属性 -->
<property name="svn.repository" value="http://svn.xxx.com/dev/myProject"/>
<property name="svn.source" value="D:\"/>
<property name="svn.username" value="username" />
<property name="svn.password" value="password" />
<!-- 日期后缀 -->
<tstamp prefix="myProject.">
<format property="TimeSign" pattern="yyyyMMdd"/>
</tstamp>
<!-- 应用lib定义 -->
<path id="applib">
<fileset dir="${dir.lib}">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- SVNKit相关包lib -->
<path id="antlib">
<fileset dir="${basedir}/antlib">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- SVN检出项目代码(第一次时用,以后只需更新) -->
<target name="svnCheckout">
<echo message="删除原始文件,重新Checkout"/>
<delete dir="${dir.build}" />
<echo message="Checkout最新代码"/>
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="checkout"/>
<arg value="--username"/>
<arg value="${svn.username}"/>
<arg value="--password"/>
<arg value="${svn.password}"/>
<arg value="${svn.repository}/myProject"/>
<classpath refid="antlib" />
</java>
</target>
<!-- SVN更新项目代码 -->
<target name="svnUpdate" depends="prepare">
<echo message="更新代码"/>
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="update"/>
<arg value="--username"/>
<arg value="${svn.username}"/>
<arg value="--password"/>
<arg value="${svn.password}"/>
<arg value="${dir.build}"/>
<classpath refid="antlib" />
</java>
</target>
<!-- 删除classes目录,为编译构建做准备 -->
<target name="prepare">
<delete dir="${dir.classes}" />
</target>
<!-- 编译构建项目 -->
<target name="build" depends="svnUpdate,prepare">
<echo message="编译Java文件"/>
<javac destdir="${dir.classes}" srcdir="${dir.src}" target="1.5" excludes="**/.svn/**">
<classpath refid="applib"/>
</javac>
<echo message="拷贝资源文件"/>
<copy todir="${dir.classes}" preservelastmodified="true">
<fileset dir="${dir.src}">
<include name="**/*.properties"/>
<include name="**/*.xml"/>
</fileset>
</copy>
</target>
<!-- 打包 -->
<target name="makewar" depends="build">
<war destfile="${svn.source}/myProject${myProject.TimeSign}.war" basedir="${dir.web}"/>
</target>
<!-- 先添加,然后提交SVN服务器 -->
<target name="svnCommit" depends="makewar">
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="add"/>
<arg value="--username"/>
<arg value="${svn.username}"/>
<arg value="--password"/>
<arg value="${svn.password}"/>
<arg value="${svn.source}\myProject${myProject.TimeSign}.war"/>
<classpath refid="antlib" />
</java>
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="commit"/>
<arg value="--username"/>
<arg value="${svn.username}"/>
<arg value="--password"/>
<arg value="${svn.password}"/>
<arg value="-m"/>
<arg value='"daily build"'/>
<arg value="${svn.source}\myProject${myProject.TimeSign}.war"/>
<classpath refid="antlib" />
</java>
</target>
</project>
说明:具体build.xml文件的写法,详细请参考Ant自带的相关文档
3. 编写批处理文件build.bat
ant -f D:\build\build.xml
说明:这里使用绝对地址,是为了方便定时任务调用
4. 将build.bat添加到Windows的任务计划,大功搞成。
注意:在编译的时候,如果提示找不到类HttpServletRequest等类似问题时,需要将jsp-api.jar和servlet-api.jar文件加入到classpath