获取SVN提交版本记录

打开SVN历史提交记录,选择需要增量的修订,右键点击“Generate ChangeLog”,粘贴处其中的全部内容

修改打包方法中的路径

修改工具方法中modelFile的txt文件路径及名称,内容为粘贴的修订记录;woekPath为项目编译后的代码位置;packPath为生成增量包位置;rep数组为替换的SVN修订记录标签(有需要可以增加)`package com.casic.core.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

/**

  • 增量补丁打包工具

  • @author liudongyu
    */
    public class IncrementalPackingUtil {

    public static void main(String[] args) throws IOException, InterruptedException {
    //补丁日志
    String modelFile = “E:/packModel.txt”;
    //本地编译项目路径
    String workPath = “G:/develop/szyd_workspace_new/apache-tomcat-7.0.81/webapps/szyd”;
    //生成增量补丁包路径
    String packPath = “E:/20190925_SZYD_01_UPDATE”;

     //补丁日志路径替换内容String[] rep = {"M /szyd/","A /szyd/"}; Thread.sleep(500);System.err.println("-------------------------------------开始打包------------------------------------------");InputStreamReader isr = new InputStreamReader(new FileInputStream(modelFile), "GBK");@SuppressWarnings("resource")BufferedReader bufferedInputStream = new BufferedReader(isr);HashSet<String> errorLine = new HashSet<>();String line=null;int num = 0;int successnum = 0;while( (line=bufferedInputStream.readLine())!=null){line = line.trim();for(int i=0;i<rep.length;i++){if(line.indexOf(rep[i])!=-1){line = line.replace(rep[i], "");}}if(line.endsWith(".java")||line.indexOf("resources/")==0){try{String substring = line.substring(line.indexOf("/"));substring = substring.replace(".java",".class");if(new File(workPath+"/WEB-INF/classes"+substring).exists()){boolean createFile = createFile(workPath+"/WEB-INF/classes"+substring,packPath);if(createFile){++successnum; System.out.println(++num+"、(成功)"+line);}}else{System.out.println(++num+"、(失败)"+line);errorLine.add(line);continue;}int i = 1;while(true){String substring_NB = substring.replace(".class", "$"+i+".class");if(substring_NB!=null&&substring_NB.indexOf("$"+i+".class")==-1){break;}//判断是否存在内部类File file = new File(workPath+"/WEB-INF/classes"+substring_NB);boolean exists = file.exists();if(exists){//如果存在try{if(createFile(workPath+"/WEB-INF/classes"+substring_NB,packPath)){++successnum; System.out.println(++num+"、(成功)"+line+"--内部类("+i+")");}}catch(Exception e){System.err.println(++num+"、(失败)"+line+"--内部类("+i+")");errorLine.add(line+"--内部类("+i+")");}finally{i+=1;}}else{break;}}}catch(Exception e){System.err.println(++num+"、(失败)"+line);errorLine.add(line);}}else if(!"".equals(line)){try{String substring = line.indexOf("/")!=-1?line.substring(line.indexOf("/")):line;File file = new File(workPath+substring);if(file.exists()&&file.isFile()){boolean createFile = createFile(workPath+substring,packPath);if(createFile){++successnum;System.out.println(++num+"、(成功)"+line);}}else{errorLine.add(line);}}catch(Exception e){System.err.println(++num+"、(失败)"+line);errorLine.add(line);}}}if(num!=successnum){System.err.println("-------------------------------------打包完成[共"+num+"个文件,成功转换"+successnum+"个文件]-------------------------------------");}else{System.err.println("-------------------------------------打包完成[共"+num+"个文件,成功转换"+successnum+"个文件]-------------------------------------");}if(errorLine.size()>0){System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>输出未成功打包的日志行");int i = 1;for (String s:errorLine) {System.out.println(i+++"."+s);}}
    

    }

    public static boolean createFile(String filePath,String packPath){
    //读取源文件
    String substring = filePath.substring(filePath.indexOf(“webapps”));
    packPath+=substring;
    File file = new File(packPath.substring(0,packPath.lastIndexOf("/")));
    if(!file.exists()){
    file.mkdirs();
    }
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;
    try {
    fileInputStream = new FileInputStream(filePath);
    fileOutputStream = new FileOutputStream(packPath);
    byte[] buf = new byte[1024];
    int bytesRead=0;
    while((bytesRead=fileInputStream.read(buf))!=-1){
    fileOutputStream.write(buf, 0, bytesRead);
    }
    }catch (Exception e) {
    e.printStackTrace();
    return false;
    }finally{
    try {
    fileInputStream.close();
    fileOutputStream.close();
    } catch (IOException e) {
    e.printStackTrace();
    return false;
    }
    }
    return true;
    }

}
`

SVN代码增量打包工具相关推荐

  1. 增量打包工具:patch-generator-desk

    patch-generator-desk 项目增量补丁包神器:全自动web增量打包发版,支持git/svn,支持多模块项目. - Author:aaron - [项目地址:https://gitee. ...

  2. 用winform实现一个B/S代码更新打包工具

    一个.net程序员必须拥有的能力就是可以随时随地写出一个自己需要的小工具,于是记录一下我的个人工具吧. 新建一个窗体应用项目,代码如下: namespace 打包工具 {partial class 代 ...

  3. svn代码量统计工具

    StatSVN介绍 StatSVN是一个Java写的开源代码统计程序,从statCVS移植而来,能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表.比如:代码行数的时间线 ...

  4. jarjar:方便的java打包工具

    今天为打包java代码破费周折,最好在stackoverflow上有人提议用jarjar包,下载下来后发现非常好用,所以就想把这个过程记录下来,但是在google上敲入jarjar之后发现了下面这篇文 ...

  5. Android 增量代码测试覆盖率工具实践

    当业务快速发展,新业务不断出现,开发同学粗心的情况下,难免会出现少测漏测的情况,如何保证新增代码有足够的测试覆盖率?当一段正常的代码,开发却修改了,测试人员没有测试其功能,如果保证能够发现? 所以代码 ...

  6. iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

    背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...

  7. Setup Factory 打包工具部分功能代码解

    Setup Factory 打包工具部分功能代码解 Application.Exit 退出安装程序,并返回一个可选的返回代码.Application.GetInstallLanguage 返回一个包含 ...

  8. ios 单元测试覆盖率怎么查看_iOS 覆盖率检测原理与增量代码测试覆盖率工具实现...

    背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...

  9. 简单了解Phar代码打包工具的使用

    简单了解Phar代码打包工具的使用 Phar 是在 PHP5 之后提供的一种类似于将代码打包的工具.本质上是想依照 Java 的 Jar 文件那种形式的代码包,不过本身由于 PHP 是不编译的,所以这 ...

最新文章

  1. 百度「AI战疫」:首次开源肺炎CT影像分析AI模型,让诊断从分钟到秒
  2. 简述Python的Numpy,SciPy和Pandas,Matplotlib的区别
  3. 回溯法实现n份作业分配给n个人完成的问题
  4. HDU - 4866 Shooting(主席树+扫描线)
  5. eclipse代码发布到服务器(Tomcat)出现乱码现象解决方法
  6. Python项目实践:国家财政数据趋势演算
  7. 金属零件图像数据集_如何使用包装零件来开发易于维护的数据仓库解决方案
  8. 华为ipd项目管理流程_开发一个产品,就是开发一门新的生意IPD落地直播问答精选...
  9. AD19实时高亮显示网络,当鼠标悬停在网络上时能自动高亮
  10. android全面屏系统哪个版本开始,屏幕类型全面屏(水滴屏)出厂系统内核Android9.0.PDF...
  11. python实现onvif客户端及问题小结
  12. python爬取固定酒店评论_爬取携程上酒店评论数据
  13. Win10环境iTunes制作iPhone铃声(2021)
  14. Windows 虚拟摄像头驱动开发之 基于AVstream流内核的摄像头驱动
  15. ROUGE 简易安装教程
  16. 网络舆情信息工作怎么做的措施及建议
  17. HashMap源码逐行分析
  18. matlab用抛物线族表示马鞍面,matlab画马鞍面
  19. php中::双冒号作用
  20. 小额贷款公司取金融牌照难实现 --》小额贷款公司可以改制成为村镇银行

热门文章

  1. SQL Server 安全认证知识【1】
  2. JavaScript学习笔记——JS错误处理
  3. mongodb关联查询
  4. App关键字(100字符)优化的方法
  5. 如何设计好的RESTful API?
  6. 成都智慧工地系统_智慧工地平台指导方案
  7. TPM密钥管理、使用
  8. linux三维动画软件,Blender2.9免费版下载
  9. USB扫码枪无焦点输入到指定页面、指定文件框中
  10. 深信服行为感知命令执行漏洞