项目分server端和protal端,这个demo只写了打包server端的。
这份build.xml有个bug就是在这段
<antcall target="changeConfigBefore" />
因为我直接在svn检出的项目上更改配置文件并导出jar。导致下一次运行ant命令时执行到svnUpdate会提示项目有冲突需要解决。
解决方法:可以把server项目拷出来然后在副本项目上操作打包,还有个更方便的方法是更改svnUpdate的target
<target name="svnUpdate" depends="svnCheckout">
<java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
<arg value="co"/><!-- update改成co 覆盖更新 -->
<arg value="--username"/>
<arg value="${prj.svn.username}"/>
<arg value="--password"/>
<arg value="${prj.svn.password}"/>
<arg value="${prj.checkout.path}/${prj.svn.name}"/>
<classpath refid="antlib" />
</java>
</target>
正文
不需要安装ant环境,ant项目结构如下
config.properties配置
#部署项目(逗号分隔)
projects=bhjf,mfjk
#源码检出目录
svncode.path=svncode
#源码编译目录
compile.path=build
#war包保存目录
war.path=war
#war检出
war.upload.path=upload
#日志目录
log.path=log
build.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--使用ant+svnkit一键部署-->
<project name="deployment" default="deployment" basedir=".">
<!-- 获取部署的项目 -->
<property file="${basedir}/config/config.properties" />
<!-- 日志 -->
<record name="${basedir}/${log.path}/log.log" loglevel="error" append="no" action="start"/>
<!-- server端lib路径 -->
<path id="server.classpath">
<fileset dir="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}/WebContent/WEB-INF/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- ant库 -->
<path id="antlib">
<fileset dir="${basedir}/antlib">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="antlib" />
<!-- 部署 -->
<target name="deployment">
<input message="选择要部署的项目" addproperty="project" validargs="${projects}" defaultvalue="bhjf" />
<property file="${basedir}/config/project/${project}.properties" />
<antcall target="getSvnProjects" />
<if>
<equals arg1="${is_upload}" arg2="1" />
<then>
<antcall target="getDestCode"/>
</then>
<else/>
</if>
<if>
<equals arg1="${project}" arg2="bhjf"/>
<then>
<antcall target="changeConfigBefore" />
</then>
<else/>
</if>
<antcall target="compile" />
<antcall target="changeConfigAfter" >
<param name="src.server" value="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />
</antcall>
<antcall target="package" />
<if>
<equals arg1="${is_upload}" arg2="1"/>
<then>
<antcall target="upload"/>
<antcall target="restart"/>
</then>
<else/>
</if>
</target>
<!-- 获取所有项目 -->
<target name="getSvnProjects">
<antcall target="checkOut">
<param name="tmp.prj.name" value="${src.prj.server}"/>
</antcall>
</target>
<!-- 公共检出方法 -->
<target name="checkOut">
<antcall target="svnUpdate">
<param name="prj.svn.name" value="${tmp.prj.name}"/>
<param name="prj.checkout.path" value="${basedir}/${svncode.path}/${src.prj.name}"/>
<param name="prj.svn.username" value="${svn.src.username}" />
<param name="prj.svn.password" value="${svn.src.password}" />
<param name="prj.svn.repository" value="${svn.src.repository}/${tmp.prj.name}" />
</antcall>
</target>
<!-- 项目更新 -->
<target name="svnUpdate" depends="svnCheckout">
<java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
<arg value="update"/>
<arg value="--username"/>
<arg value="${prj.svn.username}"/>
<arg value="--password"/>
<arg value="${prj.svn.password}"/>
<arg value="${prj.checkout.path}/${prj.svn.name}"/>
<classpath refid="antlib" />
</java>
</target>
<!-- 项目检出 -->
<target name="svnCheckout" unless="isProjectExist" depends="checkProjectExist">
<mkdir dir="${prj.checkout.path}"/>
<java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
<arg value="checkout"/>
<arg value="--username"/>
<arg value="${prj.svn.username}"/>
<arg value="--password"/>
<arg value="${prj.svn.password}"/>
<arg value="${prj.svn.repository}"/>
<classpath refid="antlib" />
</java>
</target>
<!-- 项目是否已检出 -->
<target name="checkProjectExist">
<condition property="isProjectExist">
<and>
<available file="${prj.checkout.path}/${prj.svn.name}" />
</and>
</condition>
</target>
<!-- 获取svn war文件 -->
<target name="getDestCode">
<antcall target="svnUpdate">
<param name="prj.svn.name" value="${dest.prj.name}" />
<param name="prj.checkout.path" value="${basedir}/${war.upload.path}/${src.prj.name}" />
<param name="prj.svn.username" value="${svn.dest.username}" />
<param name="prj.svn.password" value="${svn.dest.password}" />
<param name="prj.svn.repository" value="${svn.dest.repository}/${dest.prj.name}" />
</antcall>
</target>
<!-- 修改服务端打jar包前需要更改的配置文件 -->
<target name="changeConfigBefore">
<property name="svncode.server.src" value="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}" />
<replaceregexp byline="true" file="${svncode.server.src}/src/com/dy/core/trust/hisxfpay/hisxfpay.properties" match="trust.hisxfpay.weburl=(.*)" replace="trust.hisxfpay.weburl=${trust.hisxfpay.weburl}" />
<replaceregexp byline="true" file="${svncode.server.src}/src/com/dy/core/trust/hisxfpay/hisxfpay.properties" match="trust.hisxfpay.mobile.url=(.*)" replace="trust.hisxfpay.mobile.url=${trust.hisxfpay.mobile.url}" />
</target>
<!-- 编译项目 -->
<target name="compile" depends="clean">
<antcall target="build.server" />
<!--<antcall target="build.protal" >
<param name="prj_name" value="admin"/>
</antcall>
<antcall target="build.protal" >
<param name="prj_name" value="user"/>
</antcall>-->
</target>
<target name="clean">
<delete dir="${basedir}/${compile.path}/${src.prj.name}" />
</target>
<!-- 编译服务端项目 -->
<target name="build.server">
<mkdir dir="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />
<property name="server.path" value="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}" />
<property name="server.build.path" value="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />
<copy overwrite="true" todir="${server.build.path}" includeemptydirs="true">
<fileset dir="${server.path}/WebContent" excludes="**/*.svn,**/*.class" />
</copy>
<!-- 编译java文件-->
<javac srcdir="${server.path}/src" includes="**/*.java"
destdir="${server.build.path}/WEB-INF/classes" fork="true" compiler="javac1.6"
source="1.6" target="1.6" memoryInitialSize="1024m" memoryMaximumSize="1024m"
debug="true" failonerror="true" includeantruntime="true" deprecation="false" encoding="UTF-8">
<classpath refid="server.classpath" />
</javac>
<copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
<fileset dir="${server.path}/src" excludes="**/*.svn,**/*.java" />
</copy>
<copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
<fileset dir="${server.path}/config" excludes="**/*.svn,**/*.java" />
</copy>
<copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
<fileset dir="${server.path}/resources" excludes="**/*.svn,**/*.java" />
</copy>
<copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
<fileset dir="${server.path}/xmlmapper" excludes="**/*.svn,**/*.java" />
</copy>
<!-- 打jar包供protal端调用 -->
<jar jarfile="${basedir}/${compile.path}/${src.prj.name}/lib/server.jar">
<fileset dir="${server.build.path}/WEB-INF/classes" includes="**/core/**/*.key,**/core/**/*.properties,**/core/**/*.pfx,**/core/**/*.p12"/>
<fileset dir="${server.build.path}/WEB-INF/classes" includes="**/core/**/*.class" excludes="**/core/dao/interceptor/*.class,**/core/dao/jotm/*.class,**/core/dao/BaseMapper.class"/>
<fileset dir="${server.build.path}/WEB-INF/classes" includes="**/baf/entity/**/*.class" />
<fileset dir="${server.build.path}/WEB-INF/classes" includes="**/*Service.class" />
<fileset dir="${server.build.path}/WEB-INF/classes" includes="cunnar.properties" />
</jar>
</target>
<!-- 更改配置文件 -->
<target name="changeConfigAfter">
<!-- 更改数据库配置 -->
<replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.username:(.*)" replace="system.jdbc.username:${jdbc.username}" />
<replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.password:(.*)" replace="system.jdbc.password:${jdbc.password}" />
<replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.url:(.*)" replace="system.jdbc.url:${jdbc.url}" />
</target>
<!-- 打war包 -->
<target name="package">
<delete file="${basedir}/${war.path}/${src.prj.name}/${war.prj.server}.war" />
<war encoding="gbk" destfile="${basedir}/${war.path}/${src.prj.name}/${war.prj.server}.war" basedir="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}">
<include name="**/*" />
</war>
</target>
<!-- 上传到svn -->
<target name="upload">
<antcall target="svnCommit">
<param name="upload.dir" value="${basedir}/${war.upload.path}/${src.prj.name}" />
<param name="upload.war" value="${war.prj.server}.war" />
</antcall>
</target>
<!-- svn提交war -->
<target name="svnCommit" depends="isNewWar,isUpdateWar">
<if>
<equals arg1="${svn.is.add}" arg2="1" />
<then>
<antcall target="copyWar" />
<antcall target="svnAdd" />
</then>
<else>
<antcall target="copyWar" />
</else>
</if>
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="commit"/>
<arg value="--username"/>
<arg value="${svn.dest.username}"/>
<arg value="--password"/>
<arg value="${svn.dest.password}"/>
<arg value="-m"/>
<arg value='"daily build"'/>
<arg value="${upload.dir}/${upload.war}"/>
<classpath refid="antlib" />
</java>
</target>
<!-- 首次部署 -->
<target name="isNewWar" unless="isFileExist" depends="isDestWarExist">
<property name="svn.is.add" value="1" />
</target>
<!-- 二次更新war包 -->
<target name="isUpdateWar" if="isFileExist" depends="isDestWarExist">
<property name="svn.is.add" value="0" />
</target>
<!-- svn服务器是否有war文件 -->
<target name="isDestWarExist">
<condition property="isFileExist">
<and>
<available file="${upload.dir}/${upload.war}" />
</and>
</condition>
</target>
<!-- 新打的war包覆盖检出的war包 -->
<target name="copyWar">
<copy overwrite="true" tofile="${upload.dir}/${upload.war}" file="${basedir}/${war.path}/${upload.war}" />
</target>
<!-- 服务器新增war包 -->
<target name="svnAdd">
<java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
<arg value="add"/>
<arg value="--username"/>
<arg value="${svn.dest.username}"/>
<arg value="--password"/>
<arg value="${svn.dest.password}"/>
<arg value="${upload.dir}/${upload.war}"/>
<classpath refid="antlib" />
</java>
</target>
<!-- 停止tomcat服务 -->
<target name="shutdown">
<exec executable="${svn.dest.repository}/data/tomcat/bin/shutdown.sh" failonerror="false" />
<sleep seconds="10" />
</target>
<!-- 重启tomcat服务 -->
<target name="restart" depends="shutdown">
<sleep seconds="5" />
<exec executable="${svn.dest.repository}/data/tomcat/bin/startup.sh" failonerror="true" />
</target>
</project>
每个项目各自写自己的prop文件
prop文件名与config.properties里projects要能对应上
如bhjf.properties
#源代码 svn信息
svn.src.username=root
svn.src.password=123456
svn.src.repository=svn\://192.168.10.22/project/testproject
#源文件 svn路径、名称
src.prj.name=testproject
src.prj.server=test_server
#war包 svn信息
svn.dest.username=root
svn.dest.password=123456
svn.dest.repository=svn://192.168.10.22
#war包 svn路径、名称
dest.prj.name=test.server.com
war.prj.server=test.server.com
#是否部署:0只打war 1war包上传到测试站服务器
is_upload=0
#测试站数据库地址
jdbc.username:root
jdbc.password:123456
jdbc.url:jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8
#开启定时器0关闭,1开启
is_scheduled=1