利用Ant自动更新构建提交

时间:2022-10-18 11:22:23
        最近公司需要每天构建一个版本提交到SVN服务器,于是就想写一个定时任务,每天定时自动完成。大致思路是利用Ant,先更新代码,然后编译打包,最后将打包文件提交到SVN服务器。其中编译和打包任务可以利用Ant提供的任务完成,但是更新和提交SVN需要集成SVN客户端功能。

        这里介绍一种实现方法,借助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