




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用svn的补丁文件打包生成增量文件的两种方法2017年09月08日16:40:05需求缘起很多情况下,项目是不允许全量发布的,所以你得把有做修改的文件一个个挑出来,如果有成千上百的文件,你是不是要头大了?前提是你是用装有svnplugin的eclipse上做开发。这样减少了一些琐碎,重复,没有任何技术含量的工作了,避免开发人员的宝贵时间浪费在一个个挑增量文件的痛苦中。 下面会介绍利用svn的增量补丁文件如何实现自动化增量打包的原理及实现方法解决方法实现原理讲简单点,主要包括几个步骤1、生成增量的补丁文件2、读补丁文件,遍历文件,如果是java文件,需要找到对应的class文件,其他文件如js
2、p,config配置文件,然后复制一份到指定的目标路径下即可两个实现方法在学习有关增量发布的过程中,发现网上主要是两种方法1 .编写Ant脚步实现2 .纯java代码两种方法的区别在于1、 利用ant脚步需要先把整个项目重新编译一遍 (主要是将java文件编译成class文件) ,然后再去class文件目录下找到对应class文件, 最后讲class文件复制出来到一个指定的文件目录下2、纯java代码的话,不需要去编译整个项目,而是利用Eclipse的自动编译的class文件3、ant脚步相对于纯java代码的方式更复杂,配置的内容较多,编译的时候比较耗时(如果项目很大的话),而且不允许项目中
3、有任何编译出差的java代码,要不能整个项目编译会报错的,这种情况是经常会出现的,比如从svn更新代码后,就会出现某些java类出现异常的情况,这是因为其他同事提交代码的时候并未提交完全导致。编译的过程中可能会出现很奇怪的问题,可能都看不懂,对于不懂ant脚本的人来说,这也是很头痛的问题。4、纯java代码就相对更灵活,没有任何配置,只有一个java类,直接运行ain方法即可,耗时特别少。废话少说,下面就结合我目前的项目分别介绍两种方法编写纯java代码1.创建patch.txt增量文件1Kk*gvspiorar1Kk*gvspiorar ccjmiccjmi1 1flafcu.EM璃itit
4、irfO.irfceVii.eirfO.irfceVii.ej j小71017101即.上1:PFliw;1:PFliw;s sjFrit*jFrit* *j j6 6EE* * *;MGkMGk拿t%it%i1 1c c事ITIT出,li,li厝研他 h h.l-.l-JllJlllltllt-F-F!krF!krFJJQpvnmNnQpvnmNnW WVDQHVDQHW.iy.iyOpiinTjfpirl4nTjfpirl4wreiHwreiHW/M-W/M-fhCMInAhv-SMtvWkfhCMInAhv-SMtvWkUpyM*CUpyM*C 1 11HHMV1HHMVC C w w*
5、 *E EUVHIWKHMUVHIWKHMPHPHK KClri*VClri*V, ,,hwfhwfCKCKtwrfktitwrfktiCvkerh44ttCvkerh44ttb bE?M-E?M-息PlPl面MdfMdf(wcv(wcv也+部立T TI IE4E4MHTMHT PhpfrnjhPhpfrnjh3VunEriMProicdSi3VunEriMProicdSi片TlfJhqiTlfJhqi IMwlHIMwlH liJk&liJk&Y Y U UM Mrswnrswn. .MtAJMtAJ - -iVMiifWiVMiifW鱼爱一S4VIS4VIP P / /*帝
6、qv*(h-qv*(h- j-ltj-lt ”,/鼻金WiiWii里i i用UpgndnUpgndnteinfthteinfth, ,WiWi1 1i*ffio*%*i*ffio*%*1 1(t(t4 4LuiF.tnte*LuiF.tnte*. .vuvu. .handhand. .WtA*(WtA*(_. 里 区修A AF FWlWlI I MilMil$!$! , ,* *吧,1 1H H E E, ,XJXJ I IraesiiraesiiffetSMuPricesffetSMuPrices( ( .Itess-iat).Itess-iat); ;. .|r|r* *H H- -. .
7、R RiA*iiiA*iit tiXhit4HiXhit4H1 1( (-1i-1i)g)gI)I)刈(LOtftbrEFy,LOtftbrEFy,f 的MJW4MJW4弁UKUKdidiawwwSstriingftuawwwSstriingftu(.)(.)5 5f fflWStriniflWStrinifaffw(faffw() );/ /nRSrrihalnRSrrihal bu&ifbu&if、6 6.我tftfuJduJdj jGtGt, ,prKiutF9pLittprKiutF9pLitttAfi-trltwlI1tAfi-trltwlI1(ttr;(ttr;.
8、.i*!k.rcfeWi*!k.rcfeWiUiU隹二“心SS八一.-QTTJ.-QTTJJLJJLJ.-.-E E|3037*P|fl!S|3037*P|fl!S二*JHKS4JHKS42.编写java代码packagecom.xyq.maventest;importjava.io.BufferedlnputStream;importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutput
9、Stream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;publicclassFreePatchUtilpublicstaticStringpatchFile=t;/补丁文件,由eclipsesvnpluginE:workplacesEC_TAOBAOpatch.tx生成publicstaticStringprojectPath=文件夹路径E:workplacesEC_TAOBAO;项目publicstaticStringweb
10、Content=WebContent;/web应用文件夹名publicstaticntWEB-INFclasses;/class存放路径/*paramargsthrowsException*/publicstaticvoidmain(Stringargs)copyFiles(getPatchFileList();/*returnpublicpdate_pkgstaticStringdesPath=;/补丁文件包存放路径publicstaticStringversion=C:Usersyouqiang.xiongDesktopu“20170908”;/补丁版本StringclassPath=E:
11、workplacesEC_TAOBAOWebContethrowsException读取补丁配置文件解析出修改的文件并返回到list集合throwsException*/publicstaticListgetPatchFileList()throwsExceptionListfileList=FileInputStreamf=BufferedReaderdr=tf-8);Stringline;newArrayList();newFileInputStream(patchFile);newBufferedReader(newInputStreamReader(f,while(line=dr.re
12、adLine()!=null)if(line.indexOf(Index:)!=-1)line=line.replaceAll(line=line.substring(line.indexOf(fileList.add(line);dr.close();returnfileList;/*);:)+1,line.length();paramlist修改的文件publicstaticvoidcopyFiles(Listlist)for(StringfullFileName:list)src/)!=-1)/对源文件目录下的文件处StringfileName=fullFileName.replace(
13、src,);fullFileName=classPath+fileName;if(fileName.endsWith(.java)newFile(desFilePathStr);if(!desFilePath.exists()*/if(fullFileName.indexOf(fileName=fileName.replace(.java,.class);fullFileName=fullFileName.replace(.java,.class);StringtempDesPath=fileName.substring(dexOf(/);StringdesFilePathStr=desPat
14、h+sses+tempDesPath;StringdesFileNameStr=desPath+sses+fileName;0,fileName.lastIn/+version+/WEB-INF/cla/+version+/WEB-INF/claFiledesFilePath=desFilePath.mkdirs();)copyFile(fullFileName,desFileNameStr);System.out.println(fullFileName+复制完成);else对普通目录的处理StringdesFileName=fullFileName.replaceAll(webConten
15、t,);fullFileName=projectPath+/+fullFileName;/将要复制的文件全路径StringfullDesFileNameStr=desPath+/+version+desFileName;StringdesFilePathStr=fullDesFileNameStr.substring(0,fullDesFileNameStr.lastIndexOf(/);FiledesFilePath=newFile(desFilePathStr);if(!desFilePath.exists()desFilePath.mkdirs();copyFile(fullFileNa
16、me,fullDesFileNameStr);System.out.println(fullFileName+复制完成);privatestaticleNameStr)voidcopyFile(StringsourceFileNameStr,StringdesFiFilesrcFile=newFile(sourceFileNameStr);FiledesFile=newFile(desFileNameStr);trycopyFile(srcFile,desFile);catch(IOExceptione)e.printStackTrace();publicstaticvoidcopyFile(
17、FilesourceFile,FiletargetFile)throwsIOExceptionBufferedInputStreaminBuff=null;BufferedOutputStreamoutBuff=nulltry/新建文件输入流并对它进行缓冲inBuff=newBufferedInputStream(File);/新建文件输出流并对它进行缓冲outBuff=newBufferedOutputStream(getFile);/缓冲数组byte口b=newbyte1024*5;intlen;while(len=inBuff.read(b)!=-outBuff.write(b,0,le
18、n);/刷新此缓冲的输出流outBuff.flush();newFileInputStream(sourcenewFileOutputStream(tar1)finally/关闭流if(inBuff!=null)inBuff.close();if(outBuff!=null)outBuff.close();)卜面这段代码根据你们的实际情况进行修改publicstaticStringpatchFile=E:workplacesEC_TAOBAOpatch.txt/补丁文件,由eclipsesvnplugin生成StringdesPath=C:Usersyouqiang.xiongDesktopu
19、pdate_pkg;/补丁文件包存放路径public文件夹路径staticStringprojectPath=E:workplacesEC_TAOBAO”;项目publicstaticStringwebContent=WebContent;/web应用文件夹名publicstaticStringclassPath=E:workplacesEC_TAOBAOWebContentWEB-INFclasses”;/class存放路径publicstaticpublicstaticStringversion=20170908;/补丁版本3.运行main方法就能在指定的目录下生成相应的增量文件 ftft
20、. .2D17OM&2D17OM&S3S3,-,-x xwifvzwifvzdEOiiidEOiii446 6身声号晚Hz 型片三E EU U营*:*TfKCTfKC工OSMkOSMk|O)|O)U UWorklWorkl喇*,岫)心n.in.i/ /J J以上这段代码还存在一个问题,如果java类中存在内部类的情况下,貌似就不行了,可以对这段代码进行优化,新增一个方法专门用来处理内部类情况。packagecom.xyq.maventest;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;
21、importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;位*部互咱学*,椁虻帝故日购更!a丈小2017/9/B11JH3文BttMBttMimportjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;publicclassFreePatchUtilpublicstaticStringpat
22、chFile=t;/补丁文件,由eclipsesvnpluginE:workplacesEC_TAOBAOpatch.tx生成publicstaticntWEB-INFclasses”;/class存放路径StringdesPath=C:Usersyouqiang.xiongDesktopupdate_pkg;/补丁文件包存放路径public文件夹路径staticStringprojectPath=E:workplacesEC_TAOBAO;项目publicstaticStringwebContent=WebContent;/web应用文件夹名StringclassPath=E:workpla
23、cesEC_TAOBAOWebContepublicstatic*/*/publicstaticStringversion=20170908;/补丁版本/*paramargsthrowsExceptionpublicstaticvoidmain(String口args)copyFiles(getPatchFileList();/*读取补丁配置文件解析出修改的文件并返回到returnthrowsExceptionpublicstaticListgetPatchFileListListfileList=FileInputStreamf=throwsExceptionlist集合()throwsEx
24、ceptionnewArrayList();newFileInputStream(patchFile);newBufferedReader(newInputStreamReader(f,tf-8);Stringline;while(line=dr.readLine()!=null)if(line.indexOf(Index:line=line.replaceAll(line=line.substring(line.indexOf(fileList.add(line);dr.close();returnfileList;/*paramlist修改的文件*/)!=-1);:)+1,line.len
25、gth();publicstaticvoidcopyFiles(Listlist)BufferedReaderdr=for(StringfullFileName:list)src/)!=-1)/对源文件目录下的文件处StringfileName=fullFileName.replace(fullFileName=classPath+fileName;if(fileName.endsWith(.javanewFile(desFilePathStr);if(!desFilePath.exists()desFilePath.mkdirs();copyFile(fullFileName,desFile
26、NameStr);System.out.println(fullFileName+fileName=fileName.replace(.java,.class);fullFileName=fullFileName.replace(.java,.class);StringtempDesPath=fileName.substring(dexOf(/);StringdesFilePathStr=desPath+sses+tempDesPath;StringdesFileNameStr=desPath+sses+fileName;0,fileName.lastIn/+version+/WEB-INF/
27、cla/+version+/WEB-INF/claif(fullFileName.indexOf()src,);FiledesFilePath=复制完成力/遍历目录,是否存在内部类,如果有内部,则将所有的额内部类挑选出来放到copyInnerClassFile(fullFileName,desFileNameStr);else/对普通目录的处理StringdesFileName=fullFileName.replaceAll(webContent,);fullFileName=projectPath+/+fullFileName;/将要复制的文件全路径StringfullDesFileName
28、Str=desPath+/+version+desFileName;StringdesFilePathStr=fullDesFileNameStr.substring(0,fullDesFileNameStr.lastIndexOf(/);FiledesFilePath=newFile(desFilePathStr);if(!desFilePath.exists()desFilePath.mkdirs();copyFile(fullFileName,fullDesFileNameStr);System.out.println(fullFileName+复制完成);*/privatestatic
29、voidcopyInnerClassFile(StringsourceFullFileName,StringdesFullFileName)StringsourceFileName=sourceFullFileName.substring(sourceFullFileName.lastIndexOf(/)+1);StringsourcePackPath=sourceFullFileName.substring(0,sourceFullFileName.lastIndexOf(/);StringdestPackPath=desFullFileName.substring(0,desFullFil
30、eName.lastIndexOf(/);StringtempFileName=sourceFileName.split(.)0;FilepackFile=newFile(sourcePackPath);if(packFile.isDirectory()StringlistFiles=packFile.list();/*处理内部类的情况解析源路径名称,遍历此文件路径下是否存在这个类的内部类内部类编译后的格式一般是OuterClassName$InnerClassName.classparamsourceFullFileName原路径paramdesFullFileName目标路径for(Str
31、ingfileName:listFiles)/可以采用正则表达式处理if(fileName.indexOf(tempFileName+$)-1&fileName.endsWith(.class)StringnewSourceFullFileName=sourcePackPath+/+fileName;StringnewDesFullFileName=destPackPath+/+fileName;copyFile(newSourceFullFileName,newDesFullFileName);System.out.println(newSourceFullFileName+复制完成
32、voidcopyFile(StringsourceFileNameStr,StringdesFinewFile(sourceFileNameStr);newFile(desFileNameStr);try);privatestaticleNameStr)FilesrcFile=FiledesFile=copyFile(srcFile,desFile);catch(lOExceptione)e.printStackTrace();publicstaticvoidcopyFile(FilesourceFile,FiletargetFile)sIOExceptionBufferedInputStre
33、aminBuff=null;BufferedOutputStreamoutBuff=null;try/新建文件输入流并对它进行缓冲inBuff=newBufferedInputStream(newFileInputStream(sourceFile);/新建文件输出流并对它进行缓冲outBuff=newBufferedOutputStream(newFileOutputStream(targetFile);throw/缓冲数组byteb=newbyte1024*5;intlen;while(len=inBuff.read(b)!=-1)outBuff.write(b,0,len);/刷新此缓冲
34、的输出流outBuff.flush();finally/关闭流if(inBuff!=null)inBuff.close();if(outBuff!=null)outBuff.close();至此通过java代码块自动生成增量脚本就已经完成了,是不是超级简单呀编写Ant脚步实现1.创建patch.txt文件,参考上面2.创建PatchFileKit.class/*jadclipse*/DecompiledbyJadv1.5.8g.Copyright2001PavelKegration;importjava.io.*;
35、publicclassPatchFileKitprivatestaticfinalStringprefix=Index:;publicPatchFileKit()privatestaticvoidexport(StringfileStr,StringbaseDir,StringdestDir)throwsExceptionStringsrcFile=(newStringBuilder().append(baseDir).append(fileStr).toString();newStringBuilder().append(destDir).append(fintlastIndex=desFi
36、le.lastIndexOf(StringdesPath=lastIndex!=-1?desFile.substring(ex):destDir.toString();FilesrcF=newFile(srcFile);if(srcF.exists()FiledesF=newFile(desFile);FiledesP=newFile(desPath);if(!desP.exists()desP.mkdirs();System.out.println(newStringBuilder().append(FAu6587u4EF6uFF1A).append(fileStr).toString();
37、StringdesFile=(ileStr).toString();/);FileInputStreamfis=FileOutputStreamfos=bytebuf=for(intlen=newFileInputStream(srcF);newFileOutputStream(desF);newbyte1024;0;(len=fis.read(buf)!=-1;)fos.write(buf,0,len);fos.flush();fos.close();0,lastIndu5BFCu51fis.close();publicstaticvoidmain(Stringargs)(if(args!=
38、null&args.length0)if(args.length3)(u4E01u6587u4EF6uFF1A).append(configPath).toString();System.out.println(System.out.println(ath);System.out.println(ath);else(StringconfigPath=argsStringbaseDir=argsStringdestDir=argsSystem.out.println(args0ispatchfilefullpath);args1isworkspaceprojectbasepargs2is
39、incrementfilesexportp0;1;2;newStringBuilder().append(u8865System.out.println(newStringBuilder().append(u5DE5u7A0Bu8DEFu5F84uFF1A).append(baseDir).toString();System.out.println(newStringBuilder().append(u589Eu91CFu6587u4EF6u5B58u653Eu8DEFu5F84uFF1A).append(destDir).toString();System.out.println(u5F00
40、u59CBu5BFCu51FAu589Eu91CFu6587u4EF6);tryBufferedReaderbr=er(configPath);Strings=null;doif(s=br.readLine()=null)break;s=s.trim();if(s!=null&s.startsWith(Index:)StringfileStr=s.replaceFirst().trim();export(fileStr,baseDir,destDir);newBufferedReader(newFileReadIndex:while(true);br.close();)catch(Ex
41、ceptione)(e.printStackTrace();)System.out.println(u5BFCu51FAu589Eu91CFu6587u4EF6u7ED3u675F);)3编写ant的perties属性配置文件根据各种项目不同这里的属性配置=tppweb.root=WebContentsrc.dir=src#projectclassfilepathdist.classes=WebContent/WEB-INF/classesdist.dir=build/dist#=tre
42、ndy-jst#distributejarfileversiondist.version=0.1.0#listofthefiledifffromsvnpatch.file=patch.txt#util(javaclass)toexportdifffilespatch.kit.classname=egration.PatchFileKit#=trendy-toolspatch.kit.jar.version=1.6.3increment.dist=
43、build/dist_increment/javac.debuglevel=source,lines,varsfindbugs.home=./EC_BASE/findbugs-2.0.3ivy.instance=./EC_BASE/ivysettings.xml=./EC_BASE/ecrepository/trendy/trendy-jst-cli4编写ant的build.xml脚本文件ivy.repository.jar.pathent/jarstaskdefresource=pertiespathid=trendy.classpath/includes
44、=*includes=*/targetname=wardepends=compiledescription=packagewarfile/targetn=packagewarfileofincrementfilescreateincrementwarfilecreatewarfiletargetname=warincrementdepends=compile_incrementdescriptio/echoroot/WEB-INF/web.xml/wardestfile=$increment.dist/$-$DSTAMP-$TSTAMP.patch.warbasedir=
45、$increment.webappwebxml=$basedir/$web.exportincrementfilesdepends=init_incrementdescriptiovalue=$-$pchecktheversionof$inivy.xmlifthrowserrorpatchkitjar:$-$patch.kit.jar.version.jarpatchkitclassname:$patch.kit.classnameclasspath=lib/$patch.sysprop
46、ertykey=file.encodingargvalue=$increment.filesvalue=UTF-8”/checkstyle1.运行build.xml文件=find1.点击run,控制台就会编译运行,等待一段时间就可以在指定的目录下找到增量文件、,不。4dG GSS EkgvCiptcEkgvCiptcncrncr: :Jk-JllHtJk-JllHt,F?,F? 3 3.此3131江 i ii i 江T*03T*03IWwIWw5 5|i4c1|i4c1J Jw wq qQpvnQpvnn nNvwMthnSoaNvwMthnSoa摆OpvrFflPBOpvrFflPB1 1r
47、farinlrfarinl1 1 M Mi i炳* *x xC*wC*w * * *乜周口r rF FHCHCb*Vb*VHIEHIE一C CW WI IA A- -D4D4MAMAk k属立JiJia a幽t tWiftvWiftvi i“U U部*dTKdTKAHAH孙M MJ JJJJJE E. .国1 1J JE4pon,E4pon,0 0P PIWTniiIWTniiiFiFOowOows sx%*dx%*d,/IO OEHCEHCUnra4ilBrUnra4ilB廛餐ZrZr v vp p事国*Mhg7Mhg7i i区明LnJL*LnJL*I I理个囱皿啕r r amamI I 1
48、010ilrthilrth*. .BimdBimd|hf4|hf4 rVMrVMI IUlMJMMUlMJMMpvhH4IeLpvhH4IeLBTMBTM_ _ElEl了九Wt/gLWt/gL,gMtsn%,gMtsn%斗ShowFeerorrKniShowFeerorrKnih h彳AftAft岳SI*SI*CMVCMVbvltoEF*P*vp4r4ShbvltoEF*P*vp4r4Sh二.$!*心K Ki i,iftKJMtAMESiftKJMtAMESjjFjF-icg j49ali5j49ali5 * *arH*arHtP,fif*tP,fif*力H HJ JLH.LH.ilil. . .arar加toto(口KoJiKoJiI I,-nf-D,-nf-D,ptCgnliIjiNJitr(ptCgnliIjiNJitr(3 3hrtirldhrtirldI I- -I IR R I Ii i i i -vv-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年开封运输从业资格证考试技巧
- 农业设备供货合同范本
- 劳动合同范本大全
- 2025年运城货运上岗证模拟考试试题
- 专利侵权检索合同范本
- 买卖废钢材合同范本
- 劳务合同范本无社保
- 临泉教师合同范本
- 三人合作协议合同范本
- 交电产品销售合同范例
- 湖北省武汉市汉阳区2023-2024学年七年级下学期期末数学试题
- DL-T5394-2021电力工程地下金属构筑物防腐技术导则
- 2024年心理咨询师考试题库附参考答案(综合题)
- GB/T 718-2024铸造用生铁
- 2024年武汉市东西湖自来水公司招聘笔试参考题库附带答案详解
- 2024年南京旅游职业学院单招职业适应性测试题库带答案
- 湖北省武汉市2024年七年级下学期期末数学试题附答案
- 辽宁省抚顺市顺城区2023-2024学年下学期八年级物理期中考试题
- 银行零星装饰维修 投标方案(技术方案)
- 锁骨骨折个案护理
- 农民专业合作社财务报表(三张报表)
评论
0/150
提交评论