标签:
一、基本流程
值得一提的是jar包这个部分,这个步骤是为下面编译增量包做准备的。因为增量包导出的增量文件,它依赖于整个项目的其他代码,如果没有这些代码的支持是 编译不通过。然而又不能直接通过diff得到增量的class,所以只能导出增量文件后,通过引用全部工程的代码的class再进行编译即可。
二、运行环境
1、安装jdk,不会自己上网查其他的
2、如果你还没有安装ant,那么你可以参考:http://www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html
会介绍一下ant的安装和使用的方法。
3、这里需要用到svn的ant相关工具包、命令支持。你需要下载svnant-1.3.1.zip,将里面的lib库放置在你的ant脚本的编译运行环境中。
4、因为某些项目使用到了泛型、annotation注解,使用javac有些代码是编译不通过的,所以这里使用了jdt的编译方式。参考:使用eclipse JDT compile class 会有很详细的介绍。
需要用到
jdtCompilerAdapter.jar
org.eclipse.jdt.compiler.tool_1.0.1.v_793_R33x.jar
org.eclipse.jdt.core_3.3.3.v_793_R33x.jar
org.eclipse.jdt.debug.ui_3.2.102.v20071002_r332.jar
复制到ant_home/lib目录下,如果是利用eclipse运行脚本就需要把它加载到运行环境中。可以参考上面的:使用eclipse JDT compile class
三、编写ant的build脚本
简单介绍下目录结构:
src下面的ExportIncrementFiles.java是导出增量文件要用的,它在build命令increment中执行。它会读取diff 比较后的文件中的内容,并导出文件
dest 是checkout出来最新的svn的工程
dist 是编译上面dest目录中的工程,也是svn全量war的工程目录和jar
increment_dest 是增量工程,也就是上面的ExportIncrementFiles工具导出的工程
increment_dist 是编译上面increment_dest 的工程,也是增量包的工程目录
因为每个人的项目工程目录结构不一样,所以这个脚本并不会通用,我这里指针对自己的项目进行测试。
lib中是运行环境需要的jar库,其中主要的就是svnlib 这个你可以去下载 svnant-1.3.1.zip 以及JDT编译class的jar包,这个可以通过eclipse中的plugin中的jar包找到,可以参考:使用eclipse JDT compile class
increment.export.jar就是ExportIncrementFiles的class打成的jar包,这个是自己打的包,可以直接应用class也可以的,在increment命令引用,jar下载:http://download.csdn.net/detail/ibm_hoojo/6501165
build.properties是当前build的配置文件
build.xml就是主要的ant脚本
选中部分是打的war包,这个就可以部署了
patch.txt就是svn的diff 比较出的增量文件的目录路径列表
1 package com.hoo.util; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.FileReader; 8 9 /** 10 * <b>function:</b> 导出在增量的文件 11 * @file ExportIncrementFiles.java 12 * @package com.hoo.util 13 */ 14 public class ExportIncrementFiles { 15 /** 16 * <b>function:</b> 导出增量文件 17 * @author hoojo 18 * @createDate 2013-11-2 下午10:15:43 19 * @param configPath 增量文件路径配置目录 20 * @param baseDir 基本路径 目标位置 21 * @param destDir 增量文件保存位置 22 * @throws Exception 23 */ 24 private static void export(String configPath, String baseDir, String destDir) throws Exception { 25 String srcFile = baseDir + configPath; 26 String desFile = destDir + configPath; 27 int lastIndex = desFile.lastIndexOf("/"); 28 String desPath = desFile.substring(0, lastIndex); 29 File srcF = new File(srcFile); 30 if(srcF.exists()){//如果不存在这样的源文件,就不再拷贝,这个用来解决版本之间有删除文件的情况。 31 File desF = new File(desFile); 32 File desP = new File(desPath); 33 if(!desP.exists()) { 34 desP.mkdirs(); 35 } 36 System.out.println(srcFile); 37 FileInputStream fis = new FileInputStream(srcF); 38 FileOutputStream fos = new FileOutputStream(desF); 39 40 byte[] buf = new byte[1024]; 41 int len = 0; 42 while((len = fis.read(buf)) != -1) { 43 fos.write(buf,0,len); 44 } 45 fos.flush(); 46 fos.close(); 47 fis.close(); 48 } 49 } 50 51 /** 52 * <b>function:</b> 主函数 执行导出增量包任务 53 * @param args 参数1 增量包导出文件路径,参数2 要导出的文件的所在目标位置,参数3 增量包导出保存的位置路径 54 */ 55 public static void main(String[] args) { 56 if (args.length > 0) { 57 if (args.length == 1 && "help".equals(args[0])) { 58 System.out.println("args[0] is Export Increment Files content path"); 59 System.out.println("args[1] is Export Increment Files target path"); 60 System.out.println("args[2] is Increment Files Export loaction"); 61 } else { 62 String configPath = args[0]; 63 String baseDir = args[1]; 64 String destDir = args[2]; 65 try { 66 BufferedReader br = new BufferedReader(new FileReader(configPath)); 67 String s = null; 68 while((s = br.readLine()) != null) { 69 s = s.trim();//去掉路径前面的空格 70 String str = destDir + s; 71 if(!destDir.equals(str)){//过滤空行 72 export(s, baseDir, destDir); 73 } 74 } 75 br.close(); 76 } catch (Exception e) { 77 e.printStackTrace(); 78 } 79 } 80 } 81 } 82 }
main函数参数看注释,主要就是读取patch.txt增量文件路径,导出文件到指定目录的。
1 2 <?xml version="1.0" encoding="UTF-8" ?> 3 <!-- createDate 2013-10-28 --> 4 <!-- author hoojo & http://blog.csdn.net/IBM_hoojo & http://hoojo.cnblogs.com --> 5 <project default="checkout" basedir="."> 6 <property file="build.properties"/> 7 <!-- svn 比较项目最新路径 --> 8 <property name="svn.url" value="${svn._url}"/> 9 <!-- svn 备份路径--> 10 <property name="bak.svn.url" value="${bak.svn._url}"/> 11 <property name="svn.username" value="${svn.username}"/> 12 <property name="svn.password" value="${svn.password}"/> 13 <!-- 项目名称 --> 14 <property name="webapp" value="${webapp.name}"/> 15 <!-- 目标项目的Web 名称(WEB-INF上一级的目录名称) --> 16 <property name="webroot" value="${web.root}"/> 17 <!-- svn改动文件列表信息 --> 18 <property name="compare.path.file" value="${increment.file}"/> 19 <!-- svn导出/切出文件存放目录 --> 20 <property name="dest.path" location="dest/${webapp}"/> 21 <!-- svn导出/切出文件编译后存放目录 --> 22 <property name="dist.path" location="dist/${webapp}"/> 23 <!-- svn增量文件保存目录 --> 24 <property name="increment.dest.path" location="increment_dest/${webapp}"/> 25 <!-- svn增量文件编译后保存目录 --> 26 <property name="increment.dist.path" location="increment_dist/${webapp}"/> 27 <!-- 利用jdt编译class 解决泛型不能转换的问题 需要将 28 jdtCompilerAdapter.jar 29 org.eclipse.jdt.compiler.tool_1.0.1.v_793_R33x.jar 30 org.eclipse.jdt.core_3.3.3.v_793_R33x.jar 31 org.eclipse.jdt.debug.ui_3.2.102.v20071002_r332.jar 32 复制到ant_home/lib目录下 33 <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> 34 --> 35 <path id="svnant.classpath"> 36 <fileset dir="${basedir}"> 37 <include name="**/*.jar"/> 38 </fileset> 39 </path> 40 <path id="buildpath"> 41 <fileset dir="${dest.path}"> 42 <include name="**/lib/*.jar"/> 43 </fileset> 44 <fileset dir="C:/Program Files/Java/jdk1.6.0_13"> 45 <include name="**/*.jar"/> 46 </fileset> 47 </path> 48 <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath"/> 49 <svnSetting id="svn.settings" javahl="false" svnkit="true" username="${svn.username}" password="${svn.password}" failonerror="true"/> 50 <target name="init" description="init clean dirs"> 51 <echo message="${svn.username}"/> 52 <echo message="${svn.password}"/> 53 <echo message="${webapp}"/> 54 <echo message="${webroot}"/> 55 <echo message="${compare.path.file}"/> 56 <delete dir="${dest.path}" failonerror="false" deleteonexit="true" excludes="**/lib"/> 57 <delete dir="${dist.path}" failonerror="false" deleteonexit="true" excludes="**/lib"/> 58 <delete file="${compare.path.file}" failonerror="false"/> 59 <delete dir="${increment.dest.path}" failonerror="false" deleteonexit="true"/> 60 <delete dir="${increment.dist.path}" failonerror="false" deleteonexit="true"/> 61 </target> 62 63 <!-- that is to test i svnant is available //--> 64 <target name="tool-available" depends="init"> 65 <echo message="run task test svnant is available"></echo> 66 <available resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" property="available.svnant"/> 67 <echo message="SVN-ANT is available = ${available.svnant}"></echo> 68 </target> 69 <!-- 比较差异 增量文件 --> 70 <target name="diff" description="deff/compare project"> 71 <svn refid="svn.settings"> 72 <diffSummarize oldUrl="${bak.svn.url}" newUrl="${svn.url}" outFile="${compare.path.file}" recurse="true"/> 73 </svn> 74 </target> 75 <!-- 下载 切成 导出 服务器上最新代码 --> 76 <target name="checkout" depends="tool-available" description="checkout/export project code ${svn.url} "> 77 <echo message="checkout/export project code ${svn.url}"></echo> 78 <svn refid="svn.settings"> 79 <export srcUrl="${svn.url}" destPath="${dest.path}" revision="HEAD" force="true"/> 80 </svn> 81 </target> 82 83 <!-- javac编译 --> 84 <target name="compile"> 85 <buildnumber/> 86 <echo>compile ${dest.path} ......</echo> 87 <delete dir="${dist.path}" failonerror="false" deleteonexit="true" excludes="**/lib"/> 88 <mkdir dir="${dist.path}/classes"/> 89 <javac nowarn="true" debug="${javac.debug}" debuglevel="${javac.debuglevel}" destdir="${dist.path}/classes" source="${javac.source}" target="${javac.target}" encoding="utf-8" fork="true" memoryMaximumSize="512m" includeantruntime="false"> 90 <src path="${dest.path}/src"/> 91 <!-- 92 <compilerarg value="-Xlint:unchecked"/> 93 <compilerarg value="-Xlint:deprecation"/> 94 <compilerarg value="-Xlint"/> 95 --> 96 <classpath refid="buildpath"/> 97 <classpath refid="svnant.classpath"/> 98 </javac> 99 </target> 100 101 <!-- 利用JDT编译 --> 102 <target name="compile_jdt"> 103 <buildnumber/> 104 <echo>compile ${dest_path} ......</echo> 105 <delete dir="${dist_path}" failonerror="false" deleteonexit="true" excludes="**/lib"/> 106 <mkdir dir="${dist_path}/classes"/> 107 108 <javac compiler="org.eclipse.jdt.core.JDTCompilerAdapter" nowarn="true" debug="${javac.debug}" debuglevel="${javac.debuglevel}" destdir="${dist_path}/classes" source="${javac.source}" target="${javac.target}" encoding="utf-8" fork="true" memoryMaximumSize="512m" includeantruntime="false"> 109 <src path="${dest_path}/src"/> 110 111 <classpath refid="buildpath"/> 112 <classpath refid="svnant.classpath"/> 113 </javac> 114 </target> 115 116 <!-- 利用JDT编译SVN 最新项目 --> 117 <target name="compile_svn"> 118 <!-- 回调任务 --> 119 <antcall target="compile_jdt"> 120 <param name="dest_path" value="${dest.path}"/> 121 <param name="dist_path" value="${dist.path}"/> 122 </antcall> 123 </target> 124 125 <!-- 将全部项目的class 建立jar包 --> 126 <target name="jar" depends="compile_svn"> 127 <jar destfile="${basedir}/lib/${webapp}.jar" level="9" compress="true" encoding="utf-8" basedir="${dist.path}/classes"> 128 <manifest> 129 <attribute name="Implementation-Version" value="Version: 2.2"/> 130 </manifest> 131 </jar> 132 </target> 133 134 <!-- 导出增量文件 --> 135 <target name="increment" depends="diff"> 136 <java classname="com.hoo.util.ExportIncrementFiles" classpath="${basedir}/lib/increment.export.jar" fork="true"> 137 <arg value="${compare.path.file}"/> 138 <arg value="${dest.path}/"/> 139 <arg value="${increment.dest.path}/"/> 140 </java> 141 </target> 142 143 <!-- 利用JDT编译增量文件 --> 144 <target name="compile_increment"> 145 <antcall target="compile_jdt"> 146 <param name="dest_path" value="${increment.dest.path}"/> 147 <param name="dist_path" value="${increment.dist.path}"/> 148 </antcall> 149 </target> 150 151 <!-- 全部打包 --> 152 <target name="war"> 153 <echo>create war file.......</echo> 154 155 <copy todir="${dist_path}" failonerror="false"> 156 <fileset dir="${dest_path}/${webroot}" includes="**"/> 157 </copy> 158 <move todir="${dist_path}/WEB-INF/classes" failonerror="false"> 159 <fileset dir="${dist_path}/classes" /> 160 </move> 161 <copy todir="${dist_path}/WEB-INF/classes" failonerror="false"> 162 <fileset dir="${dest_path}/src/main/" includes="**/*.xml, **/*.properties, **/*.xsd"/> 163 <fileset dir="${dest_path}/src/test/" includes="**/*.xml, **/*.properties, **/*.xsd"/> 164 <fileset dir="${dest_path}/src/resource/" includes="**/*.xml, **/*.properties, **/*.xsd"/> 165 </copy> 166 167 <!--得到当前日期--> 168 <tstamp> 169 <format property="DSTAMP" pattern="yyyyMMdd" locale="zh"/> 170 <format property="TSTAMP" pattern="HHmmss" locale="zh"/> 171 </tstamp> 172 173 <war destfile="${basedir}/${webapp}_${DSTAMP}_${TSTAMP}.war" basedir="${dist_path}" webxml="${dist_path}/WEB-INF/web.xml"/> 174 </target> 175 176 <!-- 全部打包 --> 177 <target name="war_svn"> 178 <antcall target="war"> 179 <param name="dest_path" value="${dest.path}"/> 180 <param name="dist_path" value="${dist.path}"/> 181 </antcall> 182 </target> 183 184 <!-- 全部打包 --> 185 <target name="war_increment"> 186 <copy todir="${increment.dist.path}/WEB-INF" file="${dest.path}/${webroot}/WEB-INF/web.xml"/> 187 <antcall target="war"> 188 <param name="dest_path" value="${increment.dest.path}"/> 189 <param name="dist_path" value="${increment.dist.path}"/> 190 </antcall> 191 </target> 192 193 <!-- svn 全量包 --> 194 <target name="svn_war" depends="checkout, compile_svn, war_svn"/> 195 <!-- 增量包 --> 196 <target name="increment_war" depends="checkout, increment, jar, compile_increment, war_increment"/> 197 </project>
1 #Mon, 04 Nov 2013 11:18:12 +0800 2 svn._url=http://172.31.100.100/svn/iMVS_DataComm2 3 bak.svn._url=http://172.31.100.100/svn/iMVS_DataComm 4 svn.username=hoojo 5 svn.password=mypass 6 webapp.name=iMVS_DataComm 7 web.root=WebRoot 8 increment.file=patch.txt 9 10 javac.debuglevel=source,lines,vars 11 javac.target=1.6 12 javac.source=1.6 13 javac.debug=true 14 15 运行svn_war任务可以打全部的包,也就是svn最新地址的项目工程包。 16 运行increment_war任务可以打增量包,也会形成一个war文件。 17 如果你需要发布到tomcat目录,可以写一个任务copy相关war包到tomcat的webapps的目录下,这个很简单~如果你需要调用tomcat的相关任务或命令,你需要在build脚本中加入 18 <target name="_def_tomcat_tasks"> 19 <!-- tasks: deploy,undeploy,reload,stop,start,list,roles,resources --> 20 <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask" /> 21 <taskdef name="list" classname="org.apache.catalina.ant.ListTask" /> 22 <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask" /> 23 <taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask" /> 24 <taskdef name="roles" classname="org.apache.catalina.ant.RolesTask" /> 25 <taskdef name="start" classname="org.apache.catalina.ant.StartTask" /> 26 <taskdef name="stop" classname="org.apache.catalina.ant.StopTask" /> 27 <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask" /> 28 </target> 29 关于这些命令使用方法有兴趣的可以自己研究研究。
标签:
原文地址:http://www.cnblogs.com/angleBlue/p/4801721.html