利用ant脚本 自动构建svn增量/全量 系统程序升级包

一、基本流程

值得一提的是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     关于这些命令使用方法有兴趣的可以自己研究研究。
时间: 2024-07-30 10:18:12

利用ant脚本 自动构建svn增量/全量 系统程序升级包的相关文章

Eclipse下配置Ant脚本 自动打包带签名的Android apk

虽然eclipse很少用了,但是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候,非常不方便.下边纪录下配置ant,自动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得安ant,下载对应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否安装成功. 2,在项目目录下运行:and

利用Ant脚本生成war包的详细步骤

使用ant脚本前的准备 1.下载一个ant安装包.如:apache-ant-1.8.4-bin.zip.解压到E盘. 2.配置环境变量.新增ANT_HOME:E:\apache-ant-1.8.4:PATH增加:E:\apache-ant-1.8.4\bin. 3.检查ant是否配置完成.运行->cmd输入:ant -version.查看是否打印ant的版本号. 打包的实质 生成jar包的实质 1.编译工程src文件夹下的java文件,生成相应的class文件. 2.将所有的class文件集合成

solr-DIH:dataimport增量全量创建索引

索引创建完毕,就要考虑怎么定时的去重建, 除了写solrj,可以定时调用下面两条url进行增量或者全量创建索引   全量:http://ip:port/webapp_name/core_name/dataimport?command=full-import   增量:http://ip:port/webapp_name/core_name/dataimport?command=delta-import   全量索引直接调用就可以,因为是完全删除重建   如果是增量索引,就稍微麻烦一些,首先你必须

hbase备份还原opentsdb数据之Export/Import(增量+全量)

前言 本文基于伪分布式搭建 hadoop+zookeeper+hbase+opentsdb之后,文章链接:https://www.cnblogs.com/yybrhr/p/11128149.html,对于Hbase数据备份和恢复的几种方法已经有很多大神说明了很多(https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html对hbase迁移数据的4种机制都做了说明),我就不做过多描述.本文主要实战Export 本地备份还原opentsdb数据

利用python脚本自动下载ICML会议接受的文章

最近需要下载ICML会议2015年接受的最新的文章,但是到官网一看,那么多的文章,如果我一篇一篇点击下载的话,什么时候是个头呢?于是就想着用python脚本对文章的页面进行处理,得到相关文章的url,然后进行下载. 通过观察ICML会议的Accepted Papers发现,其的结构还是比较整齐的,其中我们需要的信息的代码片段如下: <div class="paper"> <p class="title">Approval Voting and

利用shell脚本自动获取awr报表

观察Oracle数据库性能,oracle自带的awr功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.通过报告可以了解一个系统的整个运行情况,生成的报告包括多个部分. 如何获取awr报告? 通过awrrpt.sql脚本执行 通过调用ORALCE的包dbms_workload_repository.awr_report_html/dbms_workload_repository.awr_report_text 获取awr报告通常是采用html形式:打开页面比

UI测试后生成测试报告,利用shell脚本上传svn

ui测试后生成测试报告,把报告保存在某一个固定路径 shell脚本把这个报告上传 #!/bin/bash -ile #svn下载文件 #svn checkout http://svn.xxx.com/svn/xxxx/trunk/UI/report --username xxx --password dsdfsdf; svn checkout http://svn.xxx.com.cn/svn/xxxx/trunk/UI/report cd report pwd #是否存在report 文件,如

利用SHELL脚本自动拦截DDOS攻击

#!/bin/bash #fix by leipore at 2014-12-18  ddos-autoprotection.shtouch /root/back_bad_ip.txt time=`date +"%Y-%m-%d %H:%M:%S"` ar=`wc -l /root/back_bad_ip.txt |awk '{print $1}'` sleep 1 netstat -an |grep 80 |grep -v "STREAM"|awk '{print

用Ant实现Java项目的自动构建和部署

Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作. 一.             安装与配置 下载地址:http://ant.apache.org/,在本文中下载的是1.7.0版本.解压到某个目录(例如E:\apache-ant-1.7.0),即可使用. 添加系统环境变量:ANT_HOME,该变量指向Ant解压后的根目录,在此为E:\apache-ant-1.7.0. 安装与