下面的代码是maven版本

1. 创建patch.txt增量文件

保存到 文件目录下

比如 E:\aa\patch.txt

2. 编写java代码

package utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/*
* 利用svn的补丁文件打包生成增量文件
* 参考 https://blog.csdn.net/happydecai/article/details/81940484
*
* */ public class FreePatchUtil {
public static String patchFile = "E:\\patch.txt";// 补丁文件,由eclipse svn plugin生成
public static String projectPath ="E:\\Projects\\SourceCode\\adpp";// "D:\\javaprojects\\portal\\tepin-manage";// 项目文件夹路径
public static String webContent = "src/main/webapp";// web应用文件夹名
public static String classPath ="F:\\tomcat-7.0.69\\webapps\\adpp\\WEB-INF\\classes"; //"D:\\javaprojects\\portal\\tepin-manage\\target\\classes";// class存放路径
public static String desPath ="E:\\zengliangbao" ;//"C:\\Users\\sz\\Documents\\portal_for_bi";// 补丁文件包存放路径
public static String version = "patch_20190411";//+UtilDateTime.getNowTime().substring(0, 10);// 补丁版本
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
copyFiles(getPatchFileList());
} /****
* 读取补丁配置文件解析出修改的文件并返回到list集合
*
* @return
* @throws Exception
*/
public static List<String> getPatchFileList() throws Exception {
List<String> fileList = new ArrayList<String>();
FileInputStream f = new FileInputStream(patchFile);
BufferedReader dr = new BufferedReader(new InputStreamReader(f, "utf-8"));
String line;
while ((line = dr.readLine()) != null) {
if (line.startsWith("Index:")) {
line = line.replaceAll(" ", "");
line = line.substring(line.indexOf(":") + 1, line.length());
fileList.add(line);
}
}
dr.close();
return fileList;
} /***
*
* @param list
* 修改的文件
*/
public static void copyFiles(List<String> list) { for (String fullFileName : list) {
if (fullFileName.indexOf("src/main/webapp") == -1) {// 对源文件目录下的文件处理
String fileName = fullFileName.replace("src", "");//目标路径
fullFileName = classPath + fileName;
if (fileName.endsWith(".java")) {
// fileName = fileName.replace(".java", ".class").replace("/main/java", "");
// fullFileName = fullFileName.replace(".java", ".class").replace("/main/java", "");
int i= fileName.indexOf("/com");
//System.out.println(i);
if (i>0) {
fileName=fileName.substring(i);
}
//System.out.println(fileName);
fileName = fileName.replace(".java", ".class").replace("/main/java", "");
//System.out.println(fileName);
fullFileName = classPath + fileName;
fullFileName = fullFileName.replace(".java", ".class").replace("/main/java", "");
//System.out.println("fullFileName>"+fullFileName);
}else{
fileName = fileName.replace("/main/resources", "");
fullFileName = fullFileName.replace("/main/resources", "");
}
String tempDesPath = fileName.substring(0,fileName.lastIndexOf("/"));
String desFilePathStr = desPath + "/" + version + "/WEB-INF/classes" + tempDesPath;
String desFileNameStr = desPath + "/" + version + "/WEB-INF/classes" + fileName;
File desFilePath = new File(desFilePathStr);
if (!desFilePath.exists()) {
desFilePath.mkdirs();
}
copyFile(fullFileName, desFileNameStr);
System.out.println(fullFileName + "复制完成");
// 遍历目录,是否存在内部类,如果有内部,则将所有的额内部类挑选出来放到
//copyInnerClassFile(fullFileName, desFileNameStr);
} else {// 对普通目录的处理
String desFileName = fullFileName.replace(webContent, "");
fullFileName = projectPath + "/" + fullFileName;// 将要复制的文件全路径
String fullDesFileNameStr = desPath + "/" + version + "/" + desFileName;
String desFilePathStr = fullDesFileNameStr.substring(0,fullDesFileNameStr.lastIndexOf("/"));
File desFilePath = new File(desFilePathStr);
if (!desFilePath.exists()) {
desFilePath.mkdirs();
}
copyFile(fullFileName, fullDesFileNameStr);
System.out.println(fullFileName + "复制完成"); } } } /***
* 处理内部类的情况 解析源路径名称,遍历此文件路径下是否存在这个类的内部类 内部类编译后的格式一般是
* OuterClassName$InnerClassName.class
*
* @param sourceFullFileName
* 原路径
* @param desFullFileName
* 目标路径
*/
@SuppressWarnings("unused")
private static void copyInnerClassFile(String sourceFullFileName,String desFullFileName) {
String sourceFileName = sourceFullFileName.substring(sourceFullFileName.lastIndexOf("/") + 1);
String sourcePackPath = sourceFullFileName.substring(0, sourceFullFileName.lastIndexOf("/"));
String destPackPath = desFullFileName.substring(0, desFullFileName.lastIndexOf("/"));
String tempFileName = sourceFileName.split("\\.")[0];
File packFile = new File(sourcePackPath);
if (packFile.isDirectory()) {
String[] listFiles = packFile.list();
for (String fileName : listFiles) {
// 可以采用正则表达式处理
if (fileName.indexOf(tempFileName + "$") > -1 && fileName.endsWith(".class")) {
String newSourceFullFileName = sourcePackPath + "/" + fileName;
String newDesFullFileName = destPackPath + "/" + fileName;
copyFile(newSourceFullFileName, newDesFullFileName);
System.out.println(newSourceFullFileName + "复制完成");
}
}
} } private static void copyFile(String sourceFileNameStr, String desFileNameStr) {
File srcFile = new File(sourceFileNameStr);
File desFile = new File(desFileNameStr);
try {
copyFile(srcFile, desFile);
} catch (IOException e) {
e.printStackTrace();
}
} public static void copyFile(File sourceFile, File targetFile)
throws IOException {
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try {
// 新建文件输入流并对它进行缓冲
inBuff = new BufferedInputStream(new FileInputStream(sourceFile)); // 新建文件输出流并对它进行缓冲
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile)); // 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
} finally {
// 关闭流
if (inBuff != null)
inBuff.close();
if (outBuff != null)
outBuff.close();
}
}
}

利用svn的补丁文件打包生成增量文件的更多相关文章

  1. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  2. 使用ant自动编译、打包生成apk文件

    上次使用命令行生成apk文件<Android 命令行编译.打包生成apk文件>,学习命令行生成的目的是为了编写ant打下基础. 一. ant环境 下载ant包,配置环境变量 二.ant编译 ...

  3. Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式

      相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式> &l ...

  4. Android 自动编译、打包生成apk文件 4 - 多渠道批量打包

    相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式 > < ...

  5. java项目打包生成MD5文件

    之所以发出这篇博客,因为我前几天搞这个问题搞了几天,各种百度居然都没有找到相关的案例,虽然很简单的事件.可是百度博客上面居然都搜不到案例o(* ̄︶ ̄*)o觉得奇怪!!! 新总监来了,项目要上线,以前都 ...

  6. Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式

    from://http://blog.csdn.net/androiddevelop/article/details/11100109 相关文章列表: <Android 自动编译.打包生成apk ...

  7. VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭

    一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  8. 将 Python3 文件打包成 exe 文件

    我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...

  9. bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?

    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢? 如果用sublime的话如何实现代码保存后浏览器刷新成最新的代码样式? 或者有什么其他好用的工具? 从网上找了很多方法 ...

随机推荐

  1. git误commit大文件导致不能push问题解决

    git push时终端报错: error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Ent ...

  2. 基于vue 、vue-router 、firebase的todolist小项目

    第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...

  3. time to set up Goals

    Function Goal Training for new guys, meanings who takes part of QA jobs  and make other QA members g ...

  4. 【转载】DRuid 大数据分析之查询

    转载自http://yangyangmyself.iteye.com/blog/2321759 1.Druid 查询概述     上一节完成数据导入后,接下来讲讲Druid如何查询及统计分析导入的数据 ...

  5. HotSpot虚拟机对象探秘-笔记

    学习目的:探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 虚拟机在执行到一条new指令时,先要检查指令的参数(将要实例化的类)是否已经被加载.解析.初始化过,如果 ...

  6. oracle创建删除表空间

    create [undo|temporary] tablespace orcp datafile|tempfile 'E:\orcle\oracleBaseDir\oradata\orcp\orcp. ...

  7. bootstrap-editable实现bootstrap-table行内编辑

    bootstrap-editable行内编辑效果如下: 需要引入插件 列初始化代码,为可编辑的列添加editable属性: columns = [ { title: '文件名', field: 'Na ...

  8. js中for(var key in o ){};用法小记

    o不只可以是对象,key也不只可以是对象中的键. o也可以是一个数组,这时候的key就是数组的下标,从"0"开始,注意下标“0”是个字符串类型. 但是这种循环在 IE8浏览器下 对 ...

  9. JSP动作标签flush属性值

    在JSP动作标签<jsp:include flush="true"/>,flush属性可以为true或false.flush默认值为false,当把flush属性赋值为 ...

  10. Oracle根据时间恢复已删除提交的数据

    Oracle 根据数据库的时间戳恢复已删除提交的数据 1.选择一个时间点查看表中数据是否是自己想要的数据 Select * from 表名 as of timestamp to_timestamp(‘ ...